在Java中以区域设置敏感的方式验证十进制数

Wan*_*now 7 java validation

可能重复:
安全地解析数字并且区域敏感

如何以区域设置敏感的方式验证包含十进制数的字符串?NumberFormat.parse允许过多,Double.parseDouble仅适用于英语语言环境.这是我尝试过的:

public static void main(String[] args) throws ParseException {
    Locale.setDefault(Locale.GERMAN);

    NumberFormat numberFormat = NumberFormat.getNumberInstance(Locale.getDefault());
    Number parsed = numberFormat.parse("4,5.6dfhf");
    System.out.println("parsed = " + parsed); // prints 4.5 instead of throwing ParseException

    double v = Double.parseDouble("3,3"); // throws NumberFormatException, although correct
}
Run Code Online (Sandbox Code Playgroud)

Man*_*nda 2

关于

Number parsed = numberFormat.parse("4,5.6dfhf");
Run Code Online (Sandbox Code Playgroud)

问题,您可以使用NumberFormat.parse(String source, ParsePosition pos)并检查它停止解析的位置是否确实是字符串的最后一个位置。

另外,在 4.5.6 问题上,您可以尝试通过setGroupingUsed(boolean newValue)关闭分组,因为我认为这是由 '.' 产生的问题。字符是区域设置上的分组字符。

应该是这样的

NumberFormat numberFormat = NumberFormat.getNumberInstance(Locale.getDefault());
numberFormat.setGroupingUsed(false);
ParsePosition pos;
String nString = "4,5.6dfhf";

Number parsed = numberFormat.parse(nString, pos);
if (pos.getIndex() == nString.length()) // pos is set AFTER the last parsed position
   System.out.println("parsed = " + parsed);
else
   // Wrong
Run Code Online (Sandbox Code Playgroud)