在项目里面需要将byte转换成KB MB GB,并且保留两位小数,用到了DecimalFormat来格式化数据,如下:
DecimalFormat df = new DecimalFormat("0.00");
return df.format(value);//value为long类型
伙计们,这代码看起来完全没毛病,本猿自己测试,数据转换没问题,两位小数妥妥的。
但是!!!
测试拿到软件之后说apk挂了,挂了!bug报来惊出本猿一身冷汗,这怎么可能,我测试都是好着的。。。
测试:“我是在葡萄牙语环境下测试的,客户那边都是用葡语”
完蛋,本猿确实是在英文环境下测试的,没有切换到葡萄牙语,这个转换怎么还跟语言环境有关,看来又是个新的知识盲区。
bug都这么严重了,还不赶紧查!
设葡语,打开apk,果真挂了,log很明显:
08-16 00:27:50.104 E/AndroidRuntime( 7410): FATAL EXCEPTION: main
08-16 00:27:50.104 E/AndroidRuntime( 7410): Process: com.test.api, PID: 7410
08-16 00:27:50.104 E/AndroidRuntime( 7410): java.lang.NumberFormatException: For input string: "4093,07"
08-16 00:27:50.104 E/AndroidRuntime( 7410): at java.lang.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1306)
08-16 00:27:50.104 E/AndroidRuntime( 7410): at java.lang.Float.parseFloat(Float.java:459)
java.lang.NumberFormatException: For input string: “4093,07”, 数据格式异常,明明是“4093.07”,怎么变成了”4093,07”,逗号从哪来的?????
一问度娘“java.lang.NumberFormatException: For input string”,答案有了:DecimalFormat和语言环境有关,DecimalFormat格式化小数,在中英文环境下的结果是“xxx.xxxx”,但是在别的语言环境下,如俄语、葡萄牙语环境下它就变成“xxx,xxxx”。小数点变成逗号就这么来的。坑爹啊!
找到了原因,改起来还是很简单的:
//第1种方法:将格式化之后的结果进行下替换的操作,逗号替换成小数点
DecimalFormat df = new DecimalFormat("0.00");
return df.format(value).replace(",", ".");
//第2种方法:特别声明小数点分隔符为".",不根据系统语言变化而变化
DecimalFormat df = new DecimalFormat("0.00");
DecimalFormatSymbols symbols = new DecimalFormatSymbols();
symbols.setDecimalSeparator('.');
df.setDecimalFormatSymbols(symbols);
return df.format(value);
顺便贴出来转换工具类的代码(采用第1种方法):
public class FileSizeUtils {
private static final int GB = 1024 * 1024 * 1024;
private static final int MB = 1024 * 1024;
private static final int KB = 1024;
private static final int BYTE2GB = 1;
private static final int BYTE2MB = 2;
private static final int BYTE2KB = 3;
public static String getFileSize(long size, int type) {
DecimalFormat df = new DecimalFormat("0.00");
String resultSize = "";
switch (type) {
case BYTE2GB:
resultSize = df.format(size / (float) GB).replace(",", ".") + "GB";
break;
case BYTE2MB:
resultSize = df.format(size / (float) MB).replace(",", ".") + "MB";
break;
case BYTE2KB:
resultSize = df.format(size / (float) KB).replace(",", ".") + "KB";
break;
default:
break;
}
return resultSize;
}
}
踩坑快乐