为什么德语本地化的 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
不强制执行任何关于对特定数量的数字进行分组的规则。
因此在您的代码中 点实际上被忽略了 。 3
和 2
被认为是 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.parse
的JavaDoc:
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
方法对于您的语言环境将始终成功。 (有没有连阿拉伯数字都看不懂的语言环境?)
我希望
var decimal = DecimalFormat.getInstance(locale).parse(number);
当区域设置为 de_DE 且数字为“3.2”作为“.”时,会产生 ParseException。不是此语言环境的有效分隔符。 为什么是这样?所有这些格式问题都以标准化方式处理的 Locale 的想法不是吗?
句号在德语数字解析中实际上没有任何意义
如.
) character in German is a thousands grouping mark (not a decimal separator)。它的用法是不是语义,它没有任何意义。 DecimalFormat
不强制执行任何关于对特定数量的数字进行分组的规则。
因此在您的代码中 点实际上被忽略了 。 3
和 2
被认为是 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.parse
的JavaDoc:
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
方法对于您的语言环境将始终成功。 (有没有连阿拉伯数字都看不懂的语言环境?)