从文本文件提取带逗号数值转换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
相关产品推荐
相关产品推荐

