【问题标题】:Custom formatted number with period and comma带句点和逗号的自定义格式数字
【发布时间】:2012-09-24 13:23:42
【问题描述】:

this question 和其他几个与格式化小数有关的 SO 问题有些相关(在这种情况下,所有这些问题都对我没有帮助)。

我正在尝试将 Long 格式化为字符串,例如123456 -> 012.345,6(句号后跟逗号看起来很奇怪,这是项目要求)。

我正在尝试使用 DecimalFormat 进行格式化:

私有静态最终 DecimalFormat 格式 = new DecimalFormat("##0.000,0");

但是在实例化过程中会抛出异常:

java.lang.IllegalArgumentException:格式错误的模式“##0.000,0”

我还尝试过预先将语言环境更改为欧盟系统,例如

NumberFormat numberFormat = NumberFormat.getNumberInstance(Locale.GERMAN);

如何以这种方式格式化数字? DecimalFormat 是错误的解决方案吗?我可以使用 NumberFormat 吗?还是我需要一个自定义格式化程序?

【问题讨论】:

    标签: java formatting


    【解决方案1】:

    您应该避免直接构造DecimalFormat。逗号总是用于在模式定义中进行分组,无论它们在目标语言环境中如何显示。同样,句点始终用于小数。这看起来不合逻辑,但必须记住这是一个模式定义,并且像 # 一样,这些字符描述的是替换,而不是字符本身。

    NumberFormat f = NumberFormat.getInstance(Locale.GERMANY);
    if (f instanceof DecimalFormat) {
        ((DecimalFormat) f).applyPattern("##0,000.0");
    }
    f.format(123456 / 10.0);
    

    需要除以10才能得到小数点后一位。

    【讨论】:

      【解决方案2】:

      对不起,如果我错过了您的请求,但如果您需要非标准的数字表示,那么您可以简单地编写一个格式化程序:

      static String formatLong(long value) {
              String ret = Long.toString(value);
      
              // Make the value 7 digits by prepending 0's
              while(ret.length()<7) ret="0"+ret;
      
              // Add a comma before the last digit
              ret = ret.substring(0,ret.length()-1)+","+ret.substring(ret.length()-1);
      
              // Add a period before the 4th digit
              ret = ret.substring(0,ret.length()-5)+"."+ret.substring(ret.length()-5);
      
              return ret;
          }
      
      long a = 123456;
      System.out.println(formatLong(a));
      

      打印“012.345,6”

      【讨论】:

        【解决方案3】:

        http://docs.oracle.com/javase/6/docs/api/java/text/DecimalFormat.html

        让我们试试这个

        new DecimalFormat("0##,###.0");

        请记住,逗号是分隔符,点是分数。你不能切换这两个。

        这种格式将打印前导零,两个重要数字,然后是三个数字,然后是小数,如果是整数,则为 0。我想。

        所以,你能得到的最好的就是 123456-> 012,345.6

        解决方法:

        int index1 = string.indexOf(',');
        int index2 = string.indexOf('.');
        string.setCharAt(index1, '.');
        string.setCharAt(index2, ',');
        

        【讨论】:

        • 您假设我使用的是普通数字;)我想我需要一个不同的(自定义?)格式化程序,因为项目要求实际上是先有一个句点,然后是逗号,这可能很奇怪看起来。
        • 我知道我们在欧洲就是这样做的,但看起来你只需要滚动你自己的......或者......在你这样格式化之后切换 PERIOD 和 COMMA 的位置.
        【解决方案4】:

        您可以使用DecimalFormatSymbols 类将分组和小数分隔符设置为您想要的任何字符。 Java 教程中显示了一个示例(在更改格式符号部分):http://docs.oracle.com/javase/tutorial/i18n/format/decimalFormat.html

        在模式本身中,分组总是用, 表示,小数点用. 表示。

        【讨论】:

          【解决方案5】:

          根据我对 javadoc 的阅读,DecimalFormat 仅支持在数字的整数部分进行“分组”;即小数点之前的部分。

          • 格式字符串的语法暗示了这一点,其中',' 只允许在'.' 之前。

          • setGroupingSize(int) 的 javadoc 也暗示了这一点

            “分组大小是数字的整数部分中分组分隔符之间的位数

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2020-06-03
            • 1970-01-01
            • 2011-12-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多