android - 防止数字根据android中的语言环境而改变

标签 android localization

当用户更改设备中的区域设置时,数字也会根据所选区域设置发生变化。这会在执行数学运算时导致 NumberFormatException 并且应用程序崩溃。下面给出了导致崩溃的代码 fragment 。

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

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

return dDataBytes; }

此代码 fragment 导致 NumberFormatException,_dataBytes 中的值显示为“७२.४१”。任何人都可以帮助我防止用户更改语言环境时数字发生变化。

更新

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

最佳答案

由于您是从原始 _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;

    }

此格式对分组分隔符和小数点分隔符敏感,但对 Locale 不敏感。

对于使用“US”编号格式的 Local,这将为您提供以下输出:

12.5 KB

5.3 B

8.0 MB

本地使用“欧洲”编号格式:

12,5 KB

5,3 B

8,0 MB

当然,这两种方法并不排斥,您可以在应用程序的不同部分混合使用这些方法。

关于android - 防止数字根据android中的语言环境而改变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49876625/

相关文章:

android - 将快照监听器添加到集合 Firestore

带有动态 Where 子句的 Android rawquery

localization - 浏览器语言: autodetect vs user select?

android - 合并图像后质量下降,Android

Android:将相同的文本输出显示到多个 EditText

java - Eclipse 找不到 .metadata/.log

Django:默认语言 i18n

ios - iTunes Connect(本地化),我们暂时无法保存您的更改。请稍后再试

javascript - ArcGIS 本地化 API

localization - 如何在 Rust 中更改格式化程序的小数点分隔符?