为什么德语本地化的 DecimalFormat 成功地将“3.2”解析为 Java 中的小数?

Why does a German localised DecimalFormat successfully parse "3.2" as a decimal in Java?

我希望

var decimal = DecimalFormat.getInstance(locale).parse(number);

当区域设置为 de_DE 且数字为“3.2”作为“.”时,会产生 ParseException。不是此语言环境的有效分隔符。 为什么是这样?所有这些格式问题都以标准化方式处理的 Locale 的想法不是吗?

句号在德语数字解析中实际上没有任何意义

, the FULL STOP (.) character in German is a thousands grouping mark (not a decimal separator)。它的用法是不是语义,它没有任何意义。 DecimalFormat 不强制执行任何关于对特定数量的数字进行分组的规则。

因此在您的代码中 点实际上被忽略了 32 被认为是 32,因此被解析为三十二。

示例代码。

//Locale locale = Locale.US ;      // Parses FULL STOP as a decimal separator, with 3.2 as result. 
Locale locale = Locale.GERMANY ;   // Parses FULL STOP as a digit grouping, with 32 as result.
String input = "3.2" ;
var decimal = DecimalFormat.getInstance( locale ).parse( input );
System.out.println( decimal ) ;

看到这个code run live at IdeOne.com

32

即使使用不同的字符而不是 .,它也会成功解析它。 参见NumberFormat.parseJavaDoc

Parses text from the beginning of the given string to produce a number. The method may not use the entire text of the given string.

只要输入以 3 开头,parse 方法对于您的语言环境将始终成功。 (有没有连阿拉伯数字都看不懂的语言环境?)