【问题标题】:DecimalFormat applyPattern in Java not overriding the locale settingsJava 中的 DecimalFormat applyPattern 不会覆盖区域设置
【发布时间】:2013-01-07 18:16:30
【问题描述】:

我正在尝试在 Java 1.6 中调试涉及 DecimalFormat#applyPattern(String) 的问题。默认的语言环境是法语,所以默认的小数点分隔符是','。但是,该模式指定应用“。”到它似乎没有的十进制格式实例。我试图调试到applyPattern(),但看不到变量值。我不太熟悉模式和正则表达式,所以我不确定问题是模式还是其他问题。是模式不正确还是代码有其他问题?

这里是sn-p的代码:

public class DecimalFormatTester
{
   static private final DecimalFormat doubleFormat = (DecimalFormat) NumberFormat.getInstance();

     static 
     {
       doubleFormat.applyPattern("############.00");
     }

  public static String toString(double value) 
  {
    synchronized (doubleFormat) 
    {
        return doubleFormat.format(value);
    }
  }
}

这是Junit 代码的示例行,但失败:

assertEquals("String values aren't equal", "2179005635.00", DecimalFormatTester.toString(2.179005635E9));

【问题讨论】:

  • 怎么了?是因为它失败的模式吗?
  • 编辑问题而不是评论以添加问题。

标签: java internationalization decimalformat


【解决方案1】:

############.00 模式中的 . 是(当前设置的)十进制字符的占位符。

如果您希望 . 作为十进制字符,那么您还必须设置 十进制字符,例如。通过设置Locale.US

您可以保存您当前的语言环境,然后设置为Locale.US,然后再设置回您保存的Locale, 但请确保您的应用不是多线程的。

你也可以使用

DecimalFormatSymbols.getInstance().setDecimalSeparator(".");

【讨论】:

  • 您是建议在应用模式之前将区域设置简单地更改为美国,还是在 DecimalFormat 上有一个方法来指定小数字符?
  • 有一个方法 setDecimalSymbols 但我从来没有用过,我会暂时将 Locale 设置为 US,然后再改回来
  • 这在静态块中对我有用: final DecimalFormatSymbols dcs = doubleFormat.getDecimalFormatSymbols(); dcs.setDecimalSeparator('.'); doubleFormat.setDecimalFormatSymbols(dcs);
【解决方案2】:

更改适当输出的语言环境。另一方面,您可以使用自定义DecimalFormatSymbols

###,###.###      123,456.789     en_US
###,###.###      123.456,789     de_DE
###,###.###      123 456,789     fr_FR

Locale-Sensitive Formatting中查看更多信息

【讨论】:

  • 感谢您的链接,它们很有帮助。
【解决方案3】:

############.00 模式中,'.'表示您的语言环境的小数分隔符。

在您的情况下,我知道它是法语小数分隔符,即“,”。

【讨论】:

    猜你喜欢
    • 2013-05-17
    • 1970-01-01
    • 2011-02-06
    • 1970-01-01
    • 1970-01-01
    • 2014-05-11
    • 2017-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多