Вопрос

У меня есть следующий код для анализа строковой переменной с именем 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, там ясно сказано:

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top