问题描述
DecimalFormat
类是否支持类似于通过方法 setGroupingUsed()
和 setGroupingSize
对数字的整数部分进行分组的小数位数字?
我希望将数字 123456.789012 格式化为 123,456.789,012
。
解决方法
根据API guide:
分组分隔符通常用于千位,但在某些情况下 它分隔一万个国家。分组大小是一个常数 分组字符之间的位数,例如 3 表示 100,000,000 或 4 表示 1,0000,0000。如果你提供一个模式 多个分组字符,最后一个字符和最后一个字符之间的间隔 整数的末尾是使用的那个。所以 "#,##,###,####" == "######,####" == "##,####,####"。
这段话表明分组符号只能应用于数字的整数部分。如果我们像这样设置一个模式:
String pattern = "###,###.###,###";
并将其传递给DecimalFormat
的实例,结果为:
java.lang.IllegalArgumentException: Malformed pattern "###,###"
而更典型的:
String pattern = "###,###.###";
按预期工作。
setGroupingUsed
不适用,因为它需要一个布尔值来指示数字是否用分组数字表示。 setGroupingSize
也不适用,因为它只控制每个组有多少个数字。
获得所需内容的唯一方法是推出自己的格式化程序。
附录:
打开 DecimalFormat
的 source 显示要格式化的数字分为三部分:leftDigits
,或数字整数部分的最左边数字,{{ 1}} 或数字整数部分的最右边数字,以及 zeroDigits
或数字的小数部分。
代码包括以下内容(注释从第 2507 行开始):
rightDigits
通过“块”,注释明确指的是// The position of the last grouping character is
// recorded (should be somewhere within the first two blocks
// of characters)
和leftDigits
,所以即使是开发者也假设分组数字只会出现在整数部分,而没有对小数部分进行分组(除了抛出异常)。
小数点后没有分组。这样的格式将无效并抛出异常。