JAVA国际化问题

在应用中有这样一段代码:

public float caculatePercent(float percent) {
  DecimalFormat df = new DecimalFormat("0.0");
  String formatedStr = df.format(percent);
   Float.valueOf(formatedStr);
}

先不考虑这段代码是否合理,反正应用中出现了。。然后应用在使用过程都是正常的,然而,突然有一天,qa说,崩溃了!

为什么之前都好好的,现在会崩溃?

qa反馈,在“印尼”语言环境下进行测试会崩溃,然而中文环境下正常。

手机设置中,切换语言环境到印尼(Bahasa Indonesia),这里千万要记住语言设置所在的位置,不然切换到印尼语之后,语言再也切不回来,不要怪我。

启动应用,执行到相应地方,果然崩溃了。抓取崩溃日志,捕获NumberFormatException,“100,0”不能被转成float!

看到这里,有点懵,为什么会有一个逗号!?

现在问题很明确,是由于这个逗号导致valueOf调用时奔溃,而在中文环境下是正常的,所以问题定位在df.format的时候,为什么会把float中的小数点变成逗号而不是我们平时用的句点。

此处省略n多字,参见:http://zhidao.baidu.com/link?url=sVh0RUMAbKhwJjRg1Xwr9owx4PNOeQ4rLe4UiEOfDDQTdJUmAiW_q82WVdTHv1xbj7qmPcL8ZKp3HWwwSKfTTq

总的来说就是,我们平时理解的“1,001.99”,在某些国家,他们是这么显示的“1.001,99”!!!。即他们是用逗号表示小数点。。

问题已明确,那么现在是要确保小数点是句点,不能是逗号。

此处可以考虑使用java.text.DecimalFormatSymbols。

DecimalFormatSymbols otherSymbols = DecimalFormatSymbols.getInstance();
// 指定分割点为句点
otherSymbols.setDecimalSeparator('.');
df.setDecimalFormatSymbols(otherSymbols);

或者可以考虑指定DecimalFromat的语言环境为具体某个国家,可以参看:http://blog.csdn.net/zhouysh/article/details/265938

这篇文章还讲到了SimpleDateFormat在多语言时候的一个坑,鸣谢作者zhouysh

原文地址:https://www.cnblogs.com/ivan-aldrich/p/5442780.html