DecimalFormat 子模式边界无法正常工作

Posted

技术标签:

【中文标题】DecimalFormat 子模式边界无法正常工作【英文标题】:DecimalFormat subpattern boundary not working right 【发布时间】:2011-02-17 16:03:10 【问题描述】:

我正在使用 DecimalFormat 创建一个始终为 6 个字符长的格式化十进制。起初我使用new DecimalFormat("000.00") 的格式字符串,但这给了我一个负数的错误。添加减号并使第一号空格变大,从而产生-005.25,而不是-05.25

我已经能够用下面的代码解决这个问题

DecimalFormat fmt;  
if(netAmt < 0)  
    fmt = new DecimalFormat("00.00");  
else  
    fmt = new DecimalFormat("000.00");  
  

System.out.println(fmt.format(netAmt));

但 DecimalFormat 有 ; 字符来格式化负数,而不是正数。我无法正确完成这项工作。据我了解,以下代码应该像上面一样工作。

DecimalFormat fmt = new DecimalFormat("000.00;00.00");  

System.out.println(fmt.format(netAmt));

结果是; 之前的模式同时用于负数和正数,导致-005.25 错误仍然存​​在。我究竟做错了什么?我误解了; 的用途吗?

【问题讨论】:

【参考方案1】:

以下字符串模式对您有帮助吗:"%06.2f%n" 固定宽度为 6,前面填充“0”?

例子

System.out.println(String.format("%06.2f%n",1.3));
System.out.println(String.format("%06.2f%n",-3.323));

当数字大于 3 位时,您希望行为是什么,即不适合?

【讨论】:

哇,效果很好。基于此以及 Rulmeq 的发现,DecimalFormat 似乎并不是所有数字格式中最好的。我必须记住这一点。谢谢!最好先剪断字符串的前几个字符,但我总是可以再次检查字符串以获得良好的度量。【参考方案2】:

我很确定第二个模式被忽略了,并且只使用了特定于否定的部分,例如- 符号或 () 等。

这就是我阅读JavaDocs下面这段话的理解

DecimalFormat 模式包含正负子模式,例如“#,##0.00;(#,##0.00)”。每个子模式都有一个前缀、数字部分和后缀。否定子模式是可选的;如果不存在,则以局部减号(在大多数语言环境中为“-”)为前缀的正子模式用作负子模式。也就是说,单独的“0.00”等同于“0.00;-0.00”。 如果有明确的否定子模式,它仅用于指定否定前缀和后缀;位数、最小位数等特征都与正向模式相同。这意味着 "#,##0.0#;(#)" 产生与 "#,##0.0#;(#,##0.0#)" 完全相同的行为。

【讨论】:

我刚刚对此进行了测试,它的工作原理与您所说的一样。我最终会使用我当时的代码。很遗憾,它的工作方式是这样的,它令人困惑和有限。 我会注意到我在测试时注意到的一些奇怪的东西。如果; 之后的模式与第一个模式的长度不同,则后缀(但不是前缀)将丢失。例如 000.00;(-+-000.00)000.00;(-+-00Y.00) 导致 (-+-005.25)000.00;(-+-0000.00)000.00;(-+-00.00) 导致 (-+-005.25 该链接中的下一段包含以下内容“必须注意符号和字符串不冲突,否则解析将不可靠” - 所以我认为它在解析模式时失败了。

以上是关于DecimalFormat 子模式边界无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

当locale更改为indonesia时,DecimalFormat无法正常工作

Angular 5 的子路由无法正常工作

自定义单元格中的 UIImageView 无法正常工作

带有水平子菜单的纯 html css 菜单。悬停在 IE 中无法正常工作

子文档变异操作无法与 XDCR 一起正常工作 [关闭]

将 UIView 作为子视图添加到 UIButton 并将其置于前面无法正常工作