如何用正则替换字符串特殊字符解决美元金额格式化报错
金额转美元格式实现方案
原有逻辑仅针对字符串开头的0和逗号做替换,覆盖场景有限,且使用Float解析金额存在精度丢失风险,按以下步骤调整即可兼容含$等各类特殊字符的输入场景:
- 第一步:全量清洗无关字符
不再局限于处理开头的0和逗号,直接通过正则移除所有不属于数字、小数点的字符,无论输入中混入$符号、其他货币标识、空格、杂项特殊字符都能一次性清理干净:// 移除所有非数字、非小数点的字符 String cleanedInput = amount.replaceAll("[^0-9.]", ""); - 第二步:规范化数值格式
清理完成后处理前导零,同时覆盖各类边界异常场景,避免解析报错:// 去除多余前导零,保留小数场景下整数位的单个0(如000.12处理为0.12,000123处理为123) cleanedInput = cleanedInput.replaceFirst("^0+(?=\\d)", ""); // 处理误输入多个小数点的场景,仅保留第一个小数点,其余小数点直接移除 if (cleanedInput.indexOf('.') != cleanedInput.lastIndexOf('.')) { int firstDotIndex = cleanedInput.indexOf('.'); cleanedInput = cleanedInput.substring(0, firstDotIndex + 1) + cleanedInput.substring(firstDotIndex + 1).replace(".", ""); } // 极端异常输入兜底,空值、纯小数点的输入统一按0处理 if (cleanedInput.isBlank() || cleanedInput.equals(".")) { cleanedInput = "0"; } - 第三步:格式化输出
金额场景不要使用单精度浮点数解析,避免精度丢失,改用BigDecimal做数值解析后,再调用美元格式化逻辑输出最终结果:import java.math.BigDecimal; import java.text.NumberFormat; import java.util.Locale; NumberFormat usdFormatter = NumberFormat.getCurrencyInstance(new Locale("en", "US")); String formattedResult = usdFormatter.format(new BigDecimal(cleanedInput));
效果验证:
- 输入
000,000123456.78→ 输出$123,456.78- 输入
$123456.78→ 输出$123,456.78- 输入
abc000$123.4→ 输出$123.40- 输入
0000.78→ 输出$0.78
内容的提问来源于stack exchange,提问作者adamn2
相关产品推荐
相关产品推荐

