You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:15:55