1. 程式人生 > >Android踩坑:小數點變逗號,DecimalFormat格式化資料跟語言環境有關

Android踩坑:小數點變逗號,DecimalFormat格式化資料跟語言環境有關

在專案裡面需要將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;
    }
}

踩坑快樂