我正在使用DecimalFormat
来解析/验证用户输入。不幸的是,它在解析时允许字符作为后缀。
示例代码:
try {
final NumberFormat numberFormat = new DecimalFormat();
System.out.println(numberFormat.parse("12abc"));
System.out.println(numberFormat.parse("abc12"));
} catch (final ParseException e) {
System.out.println("parse exception");
}
结果:
12
parse exception
我实际上期望两者都有一个解析异常。如何告诉DecimalFormat
不允许输入"12abc"
?
答案 0 :(得分:16)
来自NumberFormat.parse
的文档:
从给定字符串的开头解析文本以生成数字。 该方法可能不会使用给定字符串的整个文本。
这是一个示例,可以让您了解如何确保考虑整个字符串。
import java.text.*;
public class Test {
public static void main(String[] args) {
System.out.println(parseCompleteString("12"));
System.out.println(parseCompleteString("12abc"));
System.out.println(parseCompleteString("abc12"));
}
public static Number parseCompleteString(String input) {
ParsePosition pp = new ParsePosition(0);
NumberFormat numberFormat = new DecimalFormat();
Number result = numberFormat.parse(input, pp);
return pp.getIndex() == input.length() ? result : null;
}
}
输出:
12
null
null
答案 1 :(得分:2)
使用方法的parse(String, ParsePosition)
重载,并在解析后检查ParsePosition的.getIndex(),看它是否与输入的长度匹配。