在应用中有这样一段代码:
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中的小数点变成逗号而不是我们平时用的句点。
总的来说就是,我们平时理解的“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。