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

Имам следния код за анализ на променлива String, наречена str.

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

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

Например:

  • ако str="a10" тогава се хвърля ParseException
  • ако str="10a" тогава не е хвърлено изключение и номер=10

Не мога да използвам Double.parseDouble(str), защото str може да има запетаи и точки като 1000,98 и този формат не се разбира от този метод.

Защо се случва това? Мога ли да го потвърдя по друг начин? Благодаря


person Javi    schedule 15.02.2010    source източник
comment
Нямах предвид, че поведението на NumberFormat е грешно, но бях разбрал погрешно API. Мислех, че позицията е да посочи до кой символ искам да анализирам низа. Сега разбирам защо е проектиран по този начин. Благодаря за всичките ви отговори.   -  person Javi    schedule 15.02.2010


Отговори (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();
} 
person sfussenegger    schedule 15.02.2010
comment
Полезно за мен: използвайте setParseIntegerOnly(true), за да хвърлите изключение, ако намерите Float, когато очаквате Integer - person xdola; 12.05.2017

Ако погледнете API, ясно казва:

Анализира текст от началото на дадения низ, за ​​да създаде число. Методът може да не използва целия текст на дадения низ.

Ако искате да видите докъде е анализирал анализаторът, можете да използвате друг метод, съобразен с позицията. По този начин можете да проверите дали имате някакви завършващи знаци. Можете също така да проверите целия низ за буквено-цифрови знаци, като използвате например общи езици isAlpha.

person Alexander Torstling    schedule 15.02.2010
comment
Съжалявам sfussenegger, не видях публикацията ви, преди да актуализирам с метода за осъзнаване на позицията. - person Alexander Torstling; 15.02.2010
comment
@disown най-вероятно защото си бил по-бърз от мен ;) - person sfussenegger; 15.02.2010