导入德语区账单时,金额 1.234,56 被写成 1.234,单笔差 0.56,一天 210 笔累计少 117 元。日志里能对上时间点,这种反而好排。
解析用了默认的 en-US 规则,点被当小数点、逗号被当千分位,字符串在中途就截断了。Locale 没有跟着文件来源走,德国和美国的数字格式刚好相反。解析失败也没有抛错。这一点先确认清楚,后面就不用反复试。
NumberFormat nf = NumberFormat.getInstance(Locale.GERMANY);
nf.setParseBigDecimal(true);
BigDecimal v = (BigDecimal) nf.parse("1.234,56");
「千分位符号」排查到最后往往是很小的一处差异,前面那些复杂猜测可以先放一放。能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。
报错里带路径的,先去看那个路径在不在、权限对不对。同一份配置存在多处的,先确认改的是被加载的那一份。
新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。
处理上按这个顺序:解析前明确 Locale.GERMANY 或传入 DecimalFormatSymbols;用 setParseBigDecimal 保留精度 不要转 double;解析后回写原字符串做一次比对;用 1.234,56 和 1,234.56 两个样本各跑一次。
结果对不对很好判断,德语账单解析结果为 1234.56,210 笔导入金额与源文件逐笔一致。
