格式化数字 - Java 中的小数位数字分组

问题描述

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 也不适用,因为它只控制每个组有多少个数字。

获得所需内容的唯一方法是推出自己的格式化程序。

附录:

打开 DecimalFormatsource 显示要格式化的数字分为三部分: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,所以即使是开发者也假设分组数字只会出现在整数部分,而没有对小数部分进行分组(除了抛出异常)。

,

小数点后没有分组。这样的格式将无效并抛出异常。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...