不同国家的小数点给开发者带来的困扰

引子

以下国家或地区以句点<.>来表示基点:
澳洲、汶莱、博茨瓦纳、加拿大英语地区、香港、澳门(民间及中文的官方文件使用)、中国、印度、爱尔兰、以色列、日本、韩国、朝鲜、马来西亚、墨西哥、新西兰、尼日利亚、巴基斯坦、菲律宾、新加坡、斯里兰卡、泰国、英国、美国
以下国家或地区以逗号<,>来表示基点:
阿尔巴尼亚、安道尔、阿根廷、奥地利、阿塞拜疆、白俄罗斯、比利时、玻利维亚、波斯尼亚和黑塞哥维那、巴西、保加利亚、喀麦隆、加拿大法语地区、哥斯达黎加、克罗地亚、古马、智利、哥伦比亚、塞浦路斯、捷克、丹麦、多米尼加共和国、厄瓜多尔、萨尔瓦多、爱沙尼亚、法罗、芬兰、法国、德国、希腊、格陵兰、危地马拉、洪都拉斯、匈牙利、印度尼西亚、冰岛、意大利、拉脱维亚、立陶宛、马其顿共和国、摩尔多瓦、荷兰、澳门(葡语官方文件及土生葡人使用)挪威、尼加拉瓜、巴拿马、巴拉圭、秘鲁、波兰、葡萄牙、罗马尼亚、俄国、塞尔维亚、斯洛伐克、南非、斯洛文尼亚、西班牙、瑞典、瑞士、土耳其、乌克兰、乌拉圭、委内瑞拉、越南、津巴布韦

以上文字摘自维基百科,这表示不同的国家采用的小数点表示方法也不尽相同。

问题

根据公司市场部同事说,一位希腊客户(刚开始我并不知道这位是希腊人)在使用公司的Android国际版应用时,App发生崩溃。
我根据市场部同事的描述,也进行了一样的操作,可是没有出现什么问题。后来市场部同事发来了一段小视频,就是客户的操作视频,视频中确实发生了应用重启。我注意到视频中手机的语言不是英语,于是我就询问了市场部,得知客户是希腊人,手机语言是希腊语。接着我用希腊语的手机测试了一下,问题发生了。在集成环境中可以看到崩溃日志是数字强转异常:“1,0”不能被转为Float类型。
找到相关代码处,发现以下代码:

DecimalFormat var2 = new DecimalFormat("###.0");

代码中用var2格式化了1.0,得到的却是“1,0”,这让我很纳闷:明明是小数点,怎么就变成逗号了?我突然想起有些国家的小数点和逗号的用法和我国的是截然不同的,这就是引子中提到的。

解决

问题的原因找到了,接下来就可以修改了,尝试运行以下代码就知道如何修复此bug了:

DecimalFormat var1 = (DecimalFormat) DecimalFormat.getInstance(Locale.FRANCE);
var1.applyPattern("###.0");
System.out.println(var1.format(1.0));
var1 = (DecimalFormat) DecimalFormat.getInstance(Locale.ENGLISH);
var1.applyPattern("###.0");
System.out.println(var1.format(1.0));
DecimalFormat var2 = new DecimalFormat("###.0");
System.out.print(var2.format(1.0));

而代码中的最后两行则是默认使用了本机的默认语言。所以只要把程序中的

DecimalFormat var2 = new DecimalFormat("###.0");

改为

DecimalFormat var2 = (DecimalFormat) DecimalFormat.getInstance(Locale.FRANCE);
var2.applyPattern("###.0");

即可。

总结

总有一些莫名其妙的规矩影响着我们这些开发人员。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值