java.lang.IllegalArgumentException: 模式中有多个小数点分隔符

java.lang.IllegalArgumentException: Multiple decimal separators in pattern

我想使用 Java 中的模式格式化数字。如果模式有一个以上的小数点,我会收到错误消息。这是代码:

    DecimalFormatSymbols symbols = new DecimalFormatSymbols();
    symbols.setDecimalSeparator(',');
    
    DecimalFormat df = new DecimalFormat();
    df.setDecimalFormatSymbols(symbols);
    df.applyPattern("#.###.###.###,##");
    
    String formattedValue = df.format("123456789");

我正在测试它,尽管使用 DecimalFormatSymbols 选择了一个,但应用模式似乎需要一个“,”作为分组分隔符。您也可以在 DecimalFormatSymbols 中自定义结果设置分组分隔符。这是我在单元测试中测试的代码

    DecimalFormatSymbols symbols = new DecimalFormatSymbols();
    symbols.setDecimalSeparator(',');
    symbols.setGroupingSeparator('.');

    DecimalFormat df = new DecimalFormat();
    df.setDecimalFormatSymbols(symbols);
    df.applyPattern("#,###,###,###.##");

    Assertions.assertEquals("123.456.789,25", df.format(123456789.25));

并在 df.format 参数中使用一个数字

DecimalFormatSymbols#setGroupingSeparator('.') 方法添加到您的代码中,例如:

DecimalFormatSymbols symbols = new DecimalFormatSymbols();
symbols.setDecimalSeparator(',');
symbols.setGroupingSeparator('.');  // Add This.

但也使用特定于您系统当前区域设置的格式,例如:

df.applyPattern("#,###.##");

请注意,您实际上不需要像使用格式模式那样深入。上面显示的内容就足够了。数字组总是包含 3 位数字,您只需要在此处指定您想要一个分隔符

此外,使用数字值而不是数字字符串,例如:

int value = 123456789; // or 123_456_789
String formattedValue = df.format(value);

总而言之,这应该有效:

DecimalFormatSymbols symbols = new DecimalFormatSymbols();
symbols.setDecimalSeparator(',');
symbols.setGroupingSeparator('.');     // Added this...

DecimalFormat df = new DecimalFormat();
df.setDecimalFormatSymbols(symbols);
df.applyPattern("#,###.##");   // Note the format pattern used.
    
int value = 123456789;**strong text**         // Use a number variable.
String formattedValue = df.format(value);
System.out.println(formattedValue);

输出到控制台:

123.456.789

意大利、西班牙和挪威等一些国家/地区使用这种数字格式,考虑到这一点,您可以这样做:

DecimalFormatSymbols symbols = new DecimalFormatSymbols(java.util.Locale.ITALIAN);
DecimalFormat df = new DecimalFormat("#,###.##", symbols);
int value = 123456789; // or 123_456_789
String formattedValue = df.format(value);
System.out.println(formattedValue);

输出到控制台:

123.456.789

注意 Locale 添加到 DecimalFormatSymbols 构造函数 (Locale.ITALIAN)。还要注意实际格式。使用系统特定区域设置的格式。另请注意,使用包含文字数字的 int 变量类型而不是数字字符串。

尝试使用 double 类型(浮点)值:

DecimalFormatSymbols symbols = new DecimalFormatSymbols(java.util.Locale.ITALIAN);
DecimalFormat df = new DecimalFormat("#,###.##", symbols);
double value = 1234567.89d;
String formattedValue = df.format(value);
System.out.println(formattedValue);

输出到控制台:

1.234.567,89