有什么方法可以检查本地化字符串是否是 Java 中的有效数字?

Is there any way to check whether a localised string is a valid number in Java?

数字的正确字符串表示形式取决于区域设置:“2.5”在美国是有效数字,但在德国不是。这个数字的德语表示是“2,5”。在 Java 中有什么方法可以检测给定的字符串是否是特定区域设置的有效数字?

var decimal = DecimalFormat.getInstance(Locale.Germany).parse("2.5");

DecimalFormat 只是忽略了“.”并将数字读取为 25,这不是我需要的。我需要一种方法来说明这在德国不是有效的数字表示形式。我怎样才能得到这样的测试?

作为问题 here 的答案提出的解决方案要么完全忽略语言环境,要么提出一种既不考虑语言环境的复杂性也不考虑语言环境中的多重差异的自制解析算法。有没有一个图书馆可以简单而完整地完成这项工作?

在评论的帮助下,我想,德国语言环境确实使用了“。”作为分组分隔符。但是,根据我的说法,“2.5”仍然不是有效的小数,因为“.”(如果有的话)被用作千位分组,但“.”之后只有一位数字。这应该是一个错误,但事实并非如此。 ParsePosition 也等于字符串的长度,因为字符串被解析到最后都没有错误。

我认为这是 DecimalFormat 实现中的错误,或者,如果不是错误,至少是不完整的实现。

另一方面,正如上面@VGR 所指出的,扫描器class 完成了预期的工作。

Scanner 不像 NumberFormat:

那样宽松
Scanner scanner = new Scanner(s).useLocale(Locale.GERMANY);

if (!scanner.hasNextDouble()) {
    throw new ParseException(
        "Not a valid number: \"" + s + "\"", 0);
}

double decimal = scanner.nextDouble();
if (scanner.hasNext()) {
    throw new ParseException(
        "Extra characters found after value in \"" + s + "\"", 
        s.replace("^\s*\S+", "").length());
}