NumberFormat 国际化
Posted
技术标签:
【中文标题】NumberFormat 国际化【英文标题】:NumberFormat for internationalization 【发布时间】:2021-01-16 17:53:10 【问题描述】:我正在尝试将我的应用在 android 上国际化。 我知道在欧洲以及世界其他地区,小数和数字的表示方式与美国不同。
我正在尝试使用 NumberFormat 来帮助我更改表示欧洲小数的字符串输入。 所以,例如:
-
String number1 = "8,765" 应在格式化后变为 "8.77"
数字格式
使用 NumberFormat 格式化后,String number2 = "1.203" 应变为 "1,203"
使用 NumberFormat 格式化后,String number3 = "1.203,5632" 应变为 "1,203.56"
我的代码几乎可以完美运行,但我遗漏了一些东西: 我不想使用 String.format 方法。 我想使用 NumberFormat。
NumberFormat nformat = NumberFormat.getInstance(Locale.US);
nformat.setMaximumFractionDigits(2);
nformat.setMaximumFractionDigits(2);
String user_string = "8,747";
try
Number my_number = nformat.parse(user_string);
String result = nformat.format(my_number);
System.out.println("look at result: " + result); //this prints: 8,747.00 NOT 8.75
catch(Exception exception)
如何使 NumberFormat 打印 8.75 而不是 8,747.00 。另外,我可以对 user_string 使用 replace 或 replaceAll 调用但我不想使用额外的计算。 NumberFormat 是如何处理这个问题的?
谢谢
【问题讨论】:
【参考方案1】:在回答你的问题之前,我想告诉你不要吞下异常。一个空的 catch 块是一个不好的禁忌。编辑:发生异常时,您将不知道程序中出了什么问题。这就像蒙着眼睛编码。底部链接的简短文章更详细地解释了这种做法如何违背例外的目的。
要从一种字符串格式转换为另一种字符串格式,您需要两个格式化程序,一个用于解析,一个用于格式化。
NumberFormat europeanInputFormat = NumberFormat.getInstance(Locale.GERMAN);
NumberFormat nformat = NumberFormat.getInstance(Locale.US);
nformat.setMaximumFractionDigits(2);
String user_string = "8,747";
try
Number my_number = europeanInputFormat.parse(user_string);
String result = nformat.format(my_number);
System.out.println("look at result: " + result); // this prints: 8.75
catch (ParseException | IllegalArgumentException e)
e.printStackTrace();
输出:
查看结果:8.75
并非所有欧洲国家都使用相同的格式。我第一次使用Locale.FRENCH
。这不起作用,因为法语格式使用空格而不是点作为千位分隔符。
链接
Wikipedia article on Error hiding, error swallowing or exception swallowing
【讨论】:
谢谢它的效果很好,但不适用于 Locale.France 。另外,为什么留下一个空的 catch 子句是个坏主意? @i_o - 您可以通过将其标记为已接受来帮助社区。接受的答案有助于未来的访问者自信地使用该解决方案。更多详情请查看What should I do when someone answers my question?。以上是关于NumberFormat 国际化的主要内容,如果未能解决你的问题,请参考以下文章