Странное поведение NumberFormat Java

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

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

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

Например:

  • если ул. = "a10" затем брошена ParseException
  • если ул. = "10a" затем никакое выданное исключение и number=10

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

Почему это происходит? Я могу проверить его каким-либо другим способом?Спасибо

6
задан Javi 15 February 2010 в 12:54
поделиться

2 ответа

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

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

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

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
ответ дан 9 December 2019 в 20:43
поделиться

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

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

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

6
ответ дан 9 December 2019 в 20:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: