Android中防止数字随区域设置变化,规避NumberFormatException崩溃
解决区域设置变更导致的NumberFormatException崩溃问题
我来帮你搞定这个问题!你的代码在切换设备区域设置时崩溃,核心原因是**DecimalFormat会跟随系统区域生成本地化格式的字符串**——比如在欧洲部分地区,小数点会变成逗号(比如1,5而非1.5),但Double.parseDouble()只认英文格式的小数点(.),这就直接触发了NumberFormatException。
先看你触发异常的代码:
public static double ToDataUnitMB(double _dataBytes){ double dDataBytes; dDataBytes = Double.parseDouble(getDecimalFormat().format(_dataBytes / 1048576)); return dDataBytes; }
这段代码做了完全没必要的“数值→格式化字符串→再解析回数值”操作,这才是问题的根源。下面给你两种解决方案:
方案1:移除多余的格式化+解析(最优解)
其实你只需要完成字节转MB的数值计算,完全不需要经过字符串转换环节,直接计算就能搞定:
public static double ToDataUnitMB(double _dataBytes){ return _dataBytes / 1048576.0; }
这个写法既高效,又彻底避免了区域设置带来的任何影响。
方案2:如果确实需要格式化后再解析(比如要保留小数位数)
如果你是为了控制小数位数才用DecimalFormat,那可以指定固定的英文区域来生成和解析字符串,确保格式统一:
import java.text.DecimalFormat; import java.text.NumberFormat; import java.util.Locale; public static double ToDataUnitMB(double _dataBytes){ // 指定使用英文区域的格式化规则,确保小数点是. NumberFormat decimalFormat = DecimalFormat.getInstance(Locale.ENGLISH); // 按需设置小数位数,比如保留2位 ((DecimalFormat) decimalFormat).applyPattern("#.##"); String formattedValue = decimalFormat.format(_dataBytes / 1048576); // 因为格式是英文的,直接用Double.parseDouble解析就没问题 return Double.parseDouble(formattedValue); }
这样不管系统区域怎么切换,格式化后的字符串都是标准英文格式,解析时就不会报错了。
最后提醒一句:除非你真的需要把数值转为字符串展示,否则别随便做“数值→字符串→数值”的转换,这不仅多余,还会引入异常风险和性能损耗。
内容的提问来源于stack exchange,提问作者sijo jose
相关产品推荐
相关产品推荐

