验证语言环境中的十进制数字

可能重复:
安全解析数字和区域设置

我怎样才能验证包含十进制数字字符串敏感的方式? 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
}

关于这个问题

Number parsed = numberFormat.parse("4,5.6dfhf");

问题,你可能会使用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

从上面的评论中,您可以使用:

String input = "3,3"; // or whatever you want
boolean isValid = input.matches("^d+([.,]d+)?$");
double value = Double.parseDouble(input.replaceAll(",", "."));

如果分隔符可以是除逗号之外的其他分隔符,请将其添加到方括号中:

double value = Double.parseDouble(input.replaceAll("[,]", "."));
链接地址: http://www.djcxy.com/p/11693.html

上一篇: Validating decimal numbers in a locale

下一篇: Using CDT's Abstract Syntax Tree API to generate/write C code?