2010-02-15 15 views
6

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

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

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

Например:

  • , если строка = "A10", а затем выбрасывается ParseException
  • , если строка = "10a", то исключение не выбрасывается и число = 10

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

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

+1

Я не имел в виду, что поведение NumberFormat было неправильно, но я неправильно понял API. Я думал, что позиция должна указывать до тех пор, пока персонаж не захочет разбирать строку. Теперь я понимаю, почему он создан таким образом. Спасибо всем вашим собеседникам. – Javi

ответ

6

поведение не странно, это как она была задумана

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

Вы можете использовать позиционно знают метод синтаксического анализа, как это:

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(); 
} 
+0

Полезно для меня: используйте 'setParseIntegerOnly (true)', чтобы выдать исключение, если вы найдете Float, ожидая целое число – xdola

6

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

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

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

+0

Извините, sfussenegger, не видел вашего сообщения, прежде чем я обновил метод распознавания позиции. –

+0

@disown скорее всего потому, что вы были быстрее меня;) – sfussenegger