在Java项目里处理金额展示时,把1000显示为1k、把1500000显示为1.5M,是非常常见的需求。通过封装一个独立的工具类,可以用很少的代码完成智能单位转换,避免在每个页面逻辑里写重复判断。
为什么需要封装金额单位
散落在各处的判断语句会让代码变得难以阅读,也不方便统一调整精度或单位规则。封装之后,调用方只需要关心传入数值和拿到结果。
- 提升代码复用率
- 统一展示格式
- 后期易于扩展新单位
核心实现思路
我们以1000为基准递进,依次判断是否属于k、M、B区间,并用除法得出带单位的值。使用DecimalFormat来控制小数位数。
工具类代码示例
import java.text.DecimalFormat;
public class AmountUtil {
private static final double K = 1000.0;
private static final double M = 1000000.0;
private static final double B = 1000000000.0;
// 根据数值返回带k、M、B单位的字符串
public static String format(double amount) {
DecimalFormat df = new DecimalFormat("#.##");
if (Math.abs(amount) >= B) {
return df.format(amount / B) + "B";
} else if (Math.abs(amount) >= M) {
return df.format(amount / M) + "M";
} else if (Math.abs(amount) >= K) {
return df.format(amount / K) + "k";
}
return df.format(amount);
}
public static void main(String[] args) {
System.out.println(format(900));
System.out.println(format(1500));
System.out.println(format(2500000));
System.out.println(format(3200000000.0));
}
}
使用说明
上面代码中,Math.abs()用于处理负数金额,保证单位判断不会出错。如果以后要支持T(万亿)单位,只需在工具类里增加对应常量和判断分支。
精度与本地化
如果业务对小数位有更严格的要求,可以把DecimalFormat的格式串提取为参数,或者结合Locale做本地化展示。下面的表格列出常见数值的返回结果:
| 原始金额 | 输出结果 |
|---|---|
| 800 | 800 |
| 1200 | 1.2k |
| 3000000 | 3M |
| 4500000000 | 4.5B |
小结
把金额单位换算封装成独立方法,不仅让调用处更干净,也方便统一测试和维护。在实际项目中,建议将这类工具放到公共模块,供多个业务系统复用。