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

问题描述

我想使用 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

相关问答

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