如何解析比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.validation
–javax.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类