当用户更改设备中的区域设置时,数字也会根据所选区域设置发生变化。这会在执行数学运算时导致 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/