DecimalFormat 中的 # 与 0 的区别(中文帮助文档中翻译可能是错误的)

本文深入探讨了 Java 中 `DecimalFormat` 类中符号位置与本地化含义的实现细节,纠正了中文文档中关于 `0` 和 `#` 符号的翻译错误,并引用了 Java 源码中的原始注释来提供准确解释。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

想对数字进行格式化的时候,可能会使用到  java.text.DecimalFormat 类。中文帮助文档中,有如下

符号   位置   本地化      含义  
0       数字     是         阿拉伯数字  
#      数字      是         阿拉伯数字,如果不存在则显示为 0 

 

但是,

new java.text.DecimalFormat("#.###").format(3.0)
new java.text.DecimalFormat("0.000").format(3.0)

 

输出的结果却为:  3 和 3.000

所以,我觉得中文档文档中对这个的翻译是存在错误的,于是去JAVA源码中找到原始的注释,如下:

Symbol    Location   Localized?  Meaning  
0              Number    Yes            Digit  
#             Number     Yes            Digit, zero shows as absent  

 请注意,“zero shows as absent”,应该如何翻译,大家自己看着翻译吧。

<think>在JavaDecimalFormat中,使用模式字符串来格式化数字。其中,符号`#`和`0`都用于表示数字位,但它们的行为有重要区别:-`0`:表示一个数字位,如果该位没有数字则用0填充。-`#`:也表示一个数字位,但该位没有数字时,不显示(即省略)。具体到模式字符串`#.00000`和`0.00000`,我们分别分析:1.**整数部分**:-`#.00000`:整数部分使用`#`,表示整数部分至少有一位,但如果整数部分为0,则不会显示0(即整数部分为0时只显示小数部分)。-`0.00000`:整数部分使用`0`,表示整数部分至少有一位,如果整数部分为0,则显示0。2.**小数部分**:-两者的小数部分都是`00000`,表示小数部分必须显示5位,不足5位用0补齐,超过5位则四舍五入到5位(注意:实际四舍五入规则由DecimalFormat的舍入模式决定,默认是HALF_EVEN)。下面通过代码示例来展示区别:```javaimportjava.text.DecimalFormat;publicclassDecimalFormatExample{publicstaticvoidmain(String[]args){doublenum1=123.456789;doublenum2=0.456789;doublenum3=0.4;//使用模式"#.00000"DecimalFormatdf1=newDecimalFormat("#.00000");System.out.println("Pattern#.00000:");System.out.println("num1:"+df1.format(num1));//输出:123.45679(注意四舍五入)System.out.println("num2:"+df1.format(num2));//输出:.45679(整数部分0被省略,所以开头是点)System.out.println("num3:"+df1.format(num3));//输出:.40000//使用模式"0.00000"DecimalFormatdf2=newDecimalFormat("0.00000");System.out.println("\nPattern0.00000:");System.out.println("num1:"+df2.format(num1));//输出:123.45679System.out.println("num2:"+df2.format(num2));//输出:0.45679(整数部分0显示出来)System.out.println("num3:"+df2.format(num3));//输出:0.40000}}```输出结果:```Pattern#.00000:num1:123.45679num2:.45679num3:.40000Pattern0.00000:num1:123.45679num2:0.45679num3:0.40000```注意:-在`#.00000`模式下,当整数部分为0时,格式化为以点开头的小数,这可能会造成阅读困难(如`.45679`)。为了避免这种情况,我们通常会在整数部分使用0或者调整模式,比如使用`0.00000`或者`#0.00000`(这样整数部分为0时会显示0)。-另外,小数部分使用0可以强制显示指定位数,包括末尾的0。补充:模式`#0.00000`的效果如果整数部分为0,会显示0;如果整数部分不为0,则正常显示整数部分(不显示前导0)。例如:```javaDecimalFormatdf3=newDecimalFormat("#0.00000");System.out.println(df3.format(0.456789));//输出:0.45679System.out.println(df3.format(123.456789));//输出:123.45679```因此,根据需求选择:-如果希望整数部分为0时不显示,则用`#.00000`。-如果希望整数部分为0时显示0,则用`0.00000`或`#0.00000`(两者在整数部分为0时效果相同,但整数部分有多位时,`0.00000`会强制整数部分至少显示一位,而`#0.00000`在整数部分大于0时不会显示前导0)。另外,关于小数点的位置:两种模式的小数点位置都是固定的,即模式中点的位置。总结:模式中的`0`和`#`在整数部分的主要区别在于当整数部分为0时,是否显示这个0;在小数部分,`0`会强制显示指定位数(用0补齐),而`#`在小数部分只显示有意义的数字(不补0),但注意如果小数部分全部用`#`,则可能不显示小数点后的0,甚至如果小数部分全为0,则可能连小数点都不显示(因为小数部分被省略了)。例如,模式`#.#####`:```javaDecimalFormatdf4=newDecimalFormat("#.#####");System
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值