如何在Android Kotlin中格式化货币:有分保留2位小数无分则不保留
Android Kotlin 货币格式化实现方案
问题原因
你之前尝试的两种DecimalFormat模式存在明确问题:
$#,###,##0.##中.##代表两位可选小数位,不足两位时不会自动补0,因此1.1会显示为$1.1,不符合要求$#,###,##0.#0不符合DecimalFormat的模式规范:可选占位符#不能放在强制占位符0之前,因此会触发运行时崩溃
实现方案
最简便的实现方式是判断数值是否为整数,动态选择格式化模式,配合Kotlin扩展函数可以直接全局复用,无需引入第三方依赖:
import java.text.DecimalFormat /** * 将数值格式化为符合要求的美元货币格式 * 整数无小数位,非整数强制保留2位小数,带千分位分隔 */ fun Number.formatAsUsd(): String { val doubleValue = this.toDouble() return if (doubleValue % 1.0 == 0.0) { // 整数场景,无小数位 DecimalFormat("$#,###,##0").format(doubleValue) } else { // 非整数场景,强制保留2位小数 DecimalFormat("$#,###,##0.00").format(doubleValue) } }
测试效果
1.formatAsUsd()→ 输出$11.1.formatAsUsd()→ 输出$1.101234.56.formatAsUsd()→ 输出$1,234.5610000.formatAsUsd()→ 输出$10,000
高精度场景优化
如果涉及金额计算,为了避免浮点数精度丢失问题,推荐使用BigDecimal实现:
import java.math.BigDecimal import java.text.DecimalFormat fun BigDecimal.formatAsUsd(): String { return if (this.stripTrailingZeros().scale() <= 0) { DecimalFormat("$#,###,##0").format(this) } else { DecimalFormat("$#,###,##0.00").format(this) } }
内容的提问来源于stack exchange,提问作者SmallGrammer
相关产品推荐
相关产品推荐

