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

从文本文件提取带逗号数值转换BigDecimal时抛出ParseException排查

回答

没错,就是逗号搞的鬼!默认情况下,BigDecimal的构造函数只认点号(.)作为小数分隔符,而你的数值用的是逗号(,),它完全识别不了这个格式,直接就抛出ParseException了。

既然你没法修改输入的格式,给你两个靠谱的解决方案:

方案1:用Locale适配地区格式(更规范)

很多地区比如德语区、法语区都是用逗号做小数分隔符的,Java的NumberFormat可以通过指定对应Locale来正确解析这类数值,还能直接返回BigDecimal,非常方便:

import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Locale;

// 你的其他代码...

public BigDecimal amount;
// 用德语区Locale,该地区默认用逗号做小数分隔
NumberFormat numberFormat = NumberFormat.getNumberInstance(Locale.GERMAN);
// 开启直接解析为BigDecimal的模式
if (numberFormat instanceof DecimalFormat) {
    ((DecimalFormat) numberFormat).setParseBigDecimal(true);
}

while((line = inputStream.readLine()) != null) {
    // 先去掉字符串前后可能的空格,避免解析失败
    String extractedNum = line.substring(17,30).trim();
    amount = (BigDecimal) numberFormat.parse(extractedNum);
}

方案2:直接替换逗号为点号(适合简单场景)

如果你能100%确定提取出来的字符串里只有一个逗号(就是小数分隔符,没有千分位的逗号),那直接替换后再用BigDecimal构造也能解决问题,代码更简洁:

while((line = inputStream.readLine()) != null) {
    String extractedNum = line.substring(17,30).trim().replace(',', '.');
    amount = new BigDecimal(extractedNum);
}

⚠️ 注意:如果你的数值里可能存在千分位逗号(比如1,234,56这种),那绝对不能用替换的方法,否则会把千分位的逗号也换成点号,导致数值彻底错误,这种情况一定要用方案1。


内容的提问来源于stack exchange,提问作者Joel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:07:50