欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android踩坑:小数点变逗号,DecimalFormat格式化数据跟语言环境有关

程序员文章站 2024-03-26 12:19:53
...

在项目里面需要将byte转换成KB MB GB,并且保留两位小数,用到了DecimalFormat来格式化数据,如下:

DecimalFormat df = new DecimalFormat("0.00");
return df.format(value);//value为long类型

伙计们,这代码看起来完全没毛病,本猿自己测试,数据转换没问题,两位小数妥妥的。

但是!!!

测试拿到软件之后说apk挂了,挂了!bug报来惊出本猿一身冷汗,这怎么可能,我测试都是好着的。。。
Android踩坑:小数点变逗号,DecimalFormat格式化数据跟语言环境有关
测试:“我是在葡萄牙语环境下测试的,客户那边都是用葡语”
Android踩坑:小数点变逗号,DecimalFormat格式化数据跟语言环境有关
完蛋,本猿确实是在英文环境下测试的,没有切换到葡萄牙语,这个转换怎么还跟语言环境有关,看来又是个新的知识盲区。

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”。小数点变成逗号就这么来的。坑爹啊!
Android踩坑:小数点变逗号,DecimalFormat格式化数据跟语言环境有关

找到了原因,改起来还是很简单的:

//第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;
    }
}

踩坑快乐