使用带有自定义模式的 DecimalFormat 但没有区域设置格式

问题描述 投票:0回答:2

我想将 DecimalFormat 与自定义模式一起使用。可以使用 applyPattern() 方法设置模式,但这对于 Numberformat 来说是不可能的,因此必须使用 DecimalFormat。但是,如果不提供区域设置,则无法使用 DecimalFormat,然后它使用区域设置将特定于区域设置的模式应用到自定义模式之上。因此,本质上输出发生了变化,并且不再满足所提供模式的细节。

这个案例之前已经提出过,但没有解决方案可以帮助我们:DecimalFormat 忽略给定的模式但使用 Locale

有没有一种方法可以严格使用自定义模式而不需要任何自动区域设置格式化魔法? 谢谢。

java locale decimalformat numberformatter
2个回答
3
投票

让我先检查一下我是否正确理解您的问题。

    double number = 123456.789;
    NumberFormat nf = new DecimalFormat("###,###.###");
    System.out.println(nf.format(number));

此代码使用您的默认格式区域设置。例如,当我的默认区域设置设置为德语时,输出为:

123.456,789

使用了德语格式符号:点作为千位分隔符,逗号作为小数“点”。你不希望这样。

解决方案:我通常使用

Locale.ROOT
作为“区域设置中性区域设置”,以此表示“不要在这里执行任何区域设置特定的处理”。它在这里也有效。将格式化程序的实例化更改为:

    NumberFormat nf = new DecimalFormat("###,###.###", new DecimalFormatSymbols(Locale.ROOT));

现在输出(仍然是德语语言环境)是:

123,456.789

或者更短且可能更好的方法来获得相同的结果:

    NumberFormat nf = NumberFormat.getInstance(Locale.ROOT);

我们不需要关心

DecimalFormat
,只需关心
NumberFormat


0
投票

如果您创建自己的 DecimalFormatSymbols 实例并设置 DecimalSeparator、GroupingSeparator 等字符,则可以断开其与 Locale 的关系。

这是一个简单的例子;

    DecimalFormatSymbols decimalFormatSymbols = new DecimalFormatSymbols();
    decimalFormatSymbols.setDecimalSeparator(',');
    decimalFormatSymbols.setGroupingSeparator(Character.MIN_VALUE);
    
    DecimalFormat df = new DecimalFormat("#,##", decimalFormatSymbols);
    df.applyLocalizedPattern("#,##");
    df.setGroupingUsed(false);

    double d = 1234567.89;
    Assert.assertEquals("1234567,89",df4.format(d));

注意:您可以使用setter方法来决定分隔符。未准确使用模式。它关注分隔符值和 groupingUsed 变量。另外,如果您在 setGroupingUsed 之后调用 applyLocalizedPattern ,它会将其设置为 true。

© www.soinside.com 2019 - 2024. All rights reserved.