Как анализировать числа более строгие, чем NumberFormat в Java? - PullRequest
7 голосов
/ 07 декабря 2011

Я проверяю пользовательский ввод из формы.

Я анализирую ввод с помощью NumberFormat, но это зло и допускает почти все.Есть ли способ разобрать номер более строгим?

Например, я бы хотел, чтобы эти три ввода не были целыми, но Numberformat разрешить все из них:

NumberFormat nf = NumberFormat.getNumberInstance();
nf.setParseIntegerOnly(true);

Number numberA = nf.parse("99.731");    // 99 (not what the user expect)
Number numberB = nf.parse("99s.231");   // 99 (invalid)
Number numberC = nf.parse("9g9");       // 9  (invalid)

System.out.println(numberA.toString());
System.out.println(numberB.toString());
System.out.println(numberC.toString());

Ответы [ 7 ]

7 голосов
/ 16 февраля 2012

Может быть, это поможет:

String value = "number_to_be_parsed".trim();
NumberFormat formatter = NumberFormat.getNumberInstance();
ParsePosition pos = new ParsePosition(0);
Number parsed = formatter.parse(value, pos);
if (pos.getIndex() != value.length() || pos.getErrorIndex() != -1) {
    throw new RuntimeException("my error description");
}

(Спасибо Строгий анализ номера на mynetgear.net )

3 голосов
/ 07 декабря 2011

Есть много способов сделать это:

  • регулярное выражение - проверьте, если оно matches("\\d+")
  • с javax.validation - @Digits(fraction=0, integer=5)
  • Apache Commons IntegerValidator
2 голосов
/ 07 декабря 2011

Integer.parseInt(String) вызовет исключение NumberFormatException для всех ваших примеров.Я не уверен, что это то, что вы ищете, но это определенно "более строго".

0 голосов
/ 17 апреля 2016

Я отказался от написания своего собственного класса проверки и пошел с ВИДЖЕТЫ НЕБУЛЫ FormattedText

Он был написан поверх виджета SWTAPI, но вы можете легко адаптировать класс NumberFormatter

0 голосов
/ 10 сентября 2015

Я бы не использовал подпрограмму формата чисел java, особенно с настройками локали, если вы беспокоитесь о проверке.

    Locale numberLocale = new Locale(“es”,”ES");
    NumberFormat nf = NumberFormat.getInstance(numberLocale);
    ParsePosition pos = new ParsePosition(0);
    Number test = nf.parse("0.2", pos);

Вы могли бы ожидать, что здесь будет проблема, но нет .. test равен 2, а pos имеет индекс 3 и индекс ошибки -1.

0 голосов
/ 07 декабря 2011

Взгляните на DecimalFormat, который является подклассом NumberFormat http://docs.oracle.com/javase/6/docs/api/java/text/DecimalFormat.html

DecimalFormat myFormatter = new DecimalFormat ("###. ###");

0 голосов
/ 07 декабря 2011

Использовать DecimalFormat со строкой шаблона формата.

...