You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java DecimalFormat中#与0的差异及格式异常问题咨询

DecimalFormat格式模式疑问解答

测试代码

public class Main {
    public static void main(String[] args) {
        String pattern = ".00";         // a) => |.46|
//        String pattern = ".##";       // b) => |.46|
//        String pattern = ".0#";       // c) => |.46|
//        String pattern = "#.00";      // d) => |.46|
//        String pattern = "#.0#";      // e) => |.46|
//        String pattern = "#.##";      // f) => |0.46|
//        String pattern = ".#0";       // g) => IllegalArgumentException: Malformed pattern ".#0"

        double value = 0.456;
        DecimalFormat df = (DecimalFormat) NumberFormat.getNumberInstance(Locale.US);
        df.applyPattern(pattern);
        String output = df.format(value);
        System.out.printf("|%s|", output);
    }  
}

问题1:为什么#.##显示小数点前的0,#.00和#.0#却不显示?

这是DecimalFormat针对小数部分位数类型的不同处理逻辑:

  • 当小数部分是##时,属于可选位数(最多保留两位,没有数字就不显示),DecimalFormat会默认开启“整数部分无有效数字时补0”的规则,目的是让整数和小数的格式保持统一(比如1.23和0.46都有整数位);
  • 当小数部分是00或0#时,属于强制至少一位小数的模式,DecimalFormat会判定这是专门用于格式化纯小数的场景,此时整数位的#(代表“有数字才显示,没有就空着”)会被直接忽略,所以不会补0。

问题2:模式.#0为什么抛出IllegalArgumentException?

因为DecimalFormat的小数部分模式有严格的顺序要求:必须把强制位0放在左侧,可选位#放在右侧,不能反过来。

  • 0是强制显示的数字位,要求对应位置必须有数字;#是可选显示的数字位,没有数字就空着。如果写成.#0,相当于让DecimalFormat先处理可选位再处理强制位,这会导致数字位的位置逻辑混乱,系统直接判定为无效模式,抛出异常。

内容的提问来源于stack exchange,提问作者Sy Pham

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 09:06:04