Странное поведение NumberFormat Java
-
20-09-2019 - |
Вопрос
У меня есть следующий код для анализа строковой переменной с именем str.
NumberFormat formatter = NumberFormat.getInstance();
Number number = formatter.parse(str);
Я хочу перехватить исключение, генерируемое, когда str не является числом, просто чтобы проверить его.Проблема, с которой я сталкиваюсь, заключается в том, что она не всегда выдает ожидаемое исключение ParseException .Когда строка str начинается с числа, но затем является символами, кажется, что она получает первые символы строки и анализирует их как число.
Например:
- если str="a10", то генерируется исключение ParseException
- если str="10a", то исключение не генерируется и число = 10
Я не могу использовать Double.parseDouble(str), потому что str может содержать запятые и точки типа 1,000.98, и этот формат не понимается этим методом.
Почему это происходит?Могу ли я подтвердить это каким-либо другим способом?Спасибо
Решение
В этом поведении нет ничего странного, оно так и задумано
Анализирует текст с начала заданной строки для получения числа.Метод может использовать не весь текст данной строки.
Вы можете использовать метод синтаксического анализа с учетом местоположения следующим образом:
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();
}
Другие советы
Если вы посмотрите на API, там ясно сказано:
Анализирует текст с начала заданной строки для получения числа.Метод может не использовать весь текст данной строки.
Если вы хотите увидеть, как далеко продвинулся синтаксический анализатор, вы можете использовать другой метод с учетом местоположения.Таким образом, вы можете проверить, есть ли у вас какие-либо завершающие символы.Вы также можете проверить всю строку на наличие буквенно-цифровых символов, используя, например, общие языки изАльфа.