当用户更改设备中的区域设置时,数字也会根据所选的区域设置进行更改。执行数学运算时,这会导致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
答案 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的不同部分使用这些方法的一些组合。