Странное поведение NumberFormat Java - PullRequest
6 голосов
/ 15 февраля 2010

У меня есть следующий код для анализа строковой переменной с именем str.

NumberFormat formatter = NumberFormat.getInstance();
Number number = formatter.parse(str);

Я хочу поймать исключение, выдаваемое, когда str не является числом, просто чтобы проверить его. У меня проблема в том, что он не всегда генерирует ожидаемое ParseException. Когда строка String начинается с цифры, но затем является символом, кажется, что она получает первые символы строки и анализирует их как число.

Например:

  • если str = "a10", то генерируется исключение ParseException
  • если str = "10a", то исключение не выдается и число = 10

Я не могу использовать Double.parseDouble (str), потому что str может иметь запятые и точки, такие как 1,000.98, и этот формат не понят этим методом.

Почему это происходит? Могу ли я подтвердить это любым другим способом? Спасибо

Ответы [ 2 ]

6 голосов
/ 15 февраля 2010

Поведение не странное, оно как задумано

Разбирает текст в начале заданной строки, чтобы получить число. Метод может не использовать весь текст данной строки.

Вы можете использовать метод синтаксического анализа с учетом позиции следующим образом:

public static double parse(String str) throws ParseException {
  NumberFormat formatter = NumberFormat.getInstance();
  ParsePosition position = new ParsePosition(0);
  Number number = formatter.parse(str, position);
  if (position.getIndex() != str.length()) {
    throw new ParseException("failed to parse entire string: " + str, position.getIndex());
  }
  return number.doubleValue();
} 
6 голосов
/ 15 февраля 2010

Если вы посмотрите на API , оно ясно говорит:

Разбирает текст с начала данная строка для получения числа. метод не может использовать весь текст данная строка.

Если вы хотите увидеть, как далеко анализатор анализировал, вы можете использовать другой метод определения местоположения . Таким образом, вы можете проверить, есть ли у вас конечные символы. Вы также можете проверить всю строку на наличие буквенно-цифровых символов, используя, например, общие langs isAlpha .

...