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

踩坑快乐

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值