Android踩坑:小數點變逗號,DecimalFormat格式化資料跟語言環境有關
阿新 • • 發佈:2019-02-06
在專案裡面需要將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”,答案有了
找到了原因,改起來還是很簡單的:
//第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;
}
}
踩坑快樂