如何对带千分位逗号的数字进行计算并格式化结果?
千分位数字计算与格式化问题
需求说明
需要处理带千分位逗号分隔的数字,完成计算后将结果格式化为带千分位逗号的形式,示例如下:
var editText1 = "12,520.00" var editText2 = "52,345.00" var result = "64,825.00" // var editText1 = "12,520" var editText2 = "52,345" var result = "64,825.00"
用户现有代码(存在问题)
// 格式化配置 val decimalSymbols = DecimalFormatSymbols(Locale.US) val format = "##,###.##" val decimal = DecimalFormat(format, decimalSymbols) decimal.roundingMode = RoundingMode.CEILING // 获取输入值 val prov = profit.text.toString().toDouble() val cust = costs.text.toString().toDouble() val amort = amortizacoes.text.toString().toDouble() val jur = interest.text.toString().toDouble() // 计算并格式化结果 val result = (prov - cust - amort - jur) * 0.32 val parsed = BigDecimal(result) val formatResult = decimal.format(parsed) tax.setText(formatResult.toString())
代码核心问题
- 输入解析失败:直接用
toDouble()解析带千分位逗号的字符串会抛出NumberFormatException,Kotlin默认不识别千分位分隔符。 - 精度丢失风险:
Double类型的浮点运算会引入精度误差,不适合金额类精确计算。 - 格式化规则不匹配需求:当前格式
##,###.##不会强制保留两位小数,无法满足示例中整数输入输出xxx.00的要求。
修正后的实现方案
完整代码
import java.math.BigDecimal import java.math.RoundingMode import java.text.DecimalFormat import java.text.DecimalFormatSymbols import java.util.Locale // 初始化输入解析器:支持解析带千分位的数字,直接返回BigDecimal避免精度损失 val inputFormat = DecimalFormat("##,###.##", DecimalFormatSymbols(Locale.US)) inputFormat.isParseBigDecimal = true // 安全解析输入值 val prov = inputFormat.parse(profit.text.toString()) as BigDecimal val cust = inputFormat.parse(costs.text.toString()) as BigDecimal val amort = inputFormat.parse(amortizacoes.text.toString()) as BigDecimal val jur = inputFormat.parse(interest.text.toString()) as BigDecimal // 用BigDecimal进行精确计算 val result = prov.subtract(cust) .subtract(amort) .subtract(jur) .multiply(BigDecimal("0.32")) // 初始化输出格式化器:强制保留两位小数,添加千分位分隔符 val outputFormat = DecimalFormat("##,###.00", DecimalFormatSymbols(Locale.US)) outputFormat.roundingMode = RoundingMode.CEILING // 设置最终格式化结果 tax.setText(outputFormat.format(result))
关键优化点
- 输入解析:用
DecimalFormat并开启isParseBigDecimal,直接将带千分位的字符串解析为BigDecimal,既避免解析异常,又保留精度。 - 精确计算:全程使用
BigDecimal的算术方法(subtract/multiply),彻底消除浮点精度误差。 - 输出格式化:将格式规则改为
##,###.00,强制保留两位小数,完全匹配需求示例的输出格式。
内容的提问来源于stack exchange,提问作者Mariano Muendane
相关产品推荐
相关产品推荐

