String.format转换小数点数据时".“被转换为”,":
场景
当设置语言为某些国家(如法国、西班牙、葡萄牙)时,使用String str = String.format("%0.2f",12.345)转换时".“会被转换为”,"
处理方式
String str = String.format(Locale.US, “%0.2f” , 12.345)即可(其实为语言文化差异导致,并非bug当时还不知道没怼测试亏了~~~)。
原因分析
String.format时会默认会通过Locale.getDefault()来转换字符,代码如下:
java/util/Formatter.java
private StringBuilder localizedMagnitude(StringBuilder sb, char[] value, Flags f, int width, Locale l){
...
char decSep = '\0';//小数点对应的字符
int len = value.length;
int dot = len;
for (int j = 0; j < len; j++) {
if (value[j] == '.') {
dot = j;
break;
}
}
if (dot < len) {
if (l == null || l.equals(Locale.US)) {
decSep = '.';
} else {
DecimalFormatSymbols dfs = DecimalFormatSymbols.getInstance(l);
decSep = dfs.getDecimalSeparator();
}
}
...
}
下面贴出维基百科中的各国小数点实例:
以下是不同国家的数字写法实例,包括小数点和数位分号(用中文数字表示为“一百二十三万四千五百六十七点八九”):
部分澳门、法国、芬兰、匈牙利、西班牙、葡萄牙、意大利和加拿大法语地区:1 234 567,89
德国、荷兰、比利时、丹麦、意大利、罗马尼亚和欧洲大多地区:1 234 567,89或1.234.567,89(手写也可能会写成1·234·567,89)
瑞士德语地区:1’234’567,89
中华人民共和国、部分澳门、澳大利亚、加拿大英语地区、大韩民国、朝鲜民主主义人民共和国、马来西亚、新加坡、英国和美国:1,234,567.89或旧写法1,234,567·89
国际单位制:1 234 567.89(句点地区)or 1 234 567,89(逗号地区)