【问题标题】:java.lang.IllegalArgumentException: Multiple decimal separators in patternjava.lang.IllegalArgumentException:模式中有多个小数分隔符
【发布时间】:2021-02-13 04:13:41
【问题描述】:

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

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

【问题讨论】:

    标签: java decimalformat


    【解决方案1】:

    我正在测试它,似乎应用模式需要一个“,”作为分组分隔符,尽管使用 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 参数中使用数字

    【讨论】:

    • 谢谢。有用。有没有什么方法可以在不明确设置小数分隔符和组分隔符的情况下得到这个结果?我试图通过使用“#.###.###.###,##”模式来实现这一点
    【解决方案2】:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-09
      • 2019-09-01
      • 2012-05-13
      • 2013-06-07
      • 1970-01-01
      相关资源
      最近更新 更多