如何解析比NumberFormat在Java中更严格的数字?

我正在validation表单中的用户输入。

我使用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()); 

也许这有助于:

 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上严格的数字解析 )

有很多方法可以做到这一点:

  • 正则表达式 – 检查它是否matches("\\d+")
  • 使用javax.validationjavax.validation @Digits(fraction=0, integer=5)
  • apache commons IntegerValidator

Integer.parseInt(String)将在所有示例上抛出NumberFormatException。 我不确定这是不是你要找的东西,但它绝对是“更严格的”。

将DecimalFormat与格式模式字符串一起使用。

看一下DecimalFormat,它是NumberFormat的子类http://docs.oracle.com/javase/6/docs/api/java/text/DecimalFormat.html

DecimalFormat myFormatter = new DecimalFormat(“###。###”);

如果您担心validation,我不会使用java的数字格式例程,特别是使用区域设置。

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

你会期望这里有一个问题,但是没有..测试等于2而pos的索引为3,错误索引为-1。

我放弃编写自己的validation类,并使用NEBULA WIDGETS FormattedText

它是通过SWT小部件API编写的,但您可以轻松地调整NumberFormatter类