根据android中的语言环境防止数字发生变化

时间:2018-04-17 11:14:59

标签: android localization

当用户更改设备中的区域设置时,数字也会根据所选的区域设置进行更改。执行数学运算时,这会导致NumberFormatException,并且应用程序正在崩溃。导致崩溃的代码片段如下所示。

public static double ToDataUnitMB(double _dataBytes){
double dDataBytes;

dDataBytes = Double.parseDouble(getDecimalFormat().format(_dataBytes / 1048576));

return dDataBytes; }

此代码段导致NumberFormatException,_dataBytes中的值显示为“72.41”。当用户更改区域设置时,任何人都可以帮助我防止更改号码。

更新

执行以下操作getDecimalFormat().format(_dataBytes / 1048576)后,我得到的值为“72.41” 因此,在解析为Double时,它显示numberFormatException

1 个答案:

答案 0 :(得分:3)

由于您从原始_dataBytes开始,因此您可以选择多种方式来设置与区域设置无关的数字格式。

第一种方法:

您可以根据需要修改以下代码段。无论用户区域设置如何,它都会为您提供相同的输出。

        String patern = "###.##"; //your pattern as per need
        Locale locale = new Locale("en", "US");
        DecimalFormat decimalFormat = (DecimalFormat) NumberFormat.getNumberInstance(locale);            
        decimalFormat.applyPattern(patern);
        double formatedDouble = Double.parseDouble(decimalFormat.format(_dataBytes/(1024*1024f)));

请记住,此方法还可以修复分组和小数分隔符,因此逗号和点将分别用作分组分隔符和小数分隔符。

第二种方法:

如果您没有严格要求Double,则可以使用类似于以下方法的格式生成格式化String

String generateFormatedFileSize(long _dataBytes) {
        String formatedFileSize = "";

        long bytes = _dataBytes;
        short unit = 1024;
        if (bytes < unit)
            formatedFileSize = bytes + " B";
        else {
            int exp = (int) (Math.log(bytes) / Math.log(unit));
            formatedFileSize = String.format("%.1f %sB", bytes / Math.pow(unit, exp), "KMGT".charAt(exp - 1));               
        }

        return formatedFileSize;

    }

此格式设置对分组分隔符和小数分隔符敏感,但对区域设置不敏感。

对于使用&#34; US&#34;编号格式,这将为您提供以下输出:

  

12.5 KB

     

5.3 B

     

8.0 MB

对于本地使用&#34;欧洲&#34;编号格式:

  

12,5 KB

     

5,3 B

     

8,0 MB

当然,这两种方法并不是唯一的,您可以在App的不同部分使用这些方法的一些组合。