【问题标题】:Double decimal formatting in JavaJava中的双十进制格式
【发布时间】:2012-09-30 03:40:26
【问题描述】:

我在格式化双精度的小数时遇到了一些问题。如果我有双重价值,例如4.0,如何格式化小数,使其改为 4.00?

【问题讨论】:

标签: java formatting double decimal


【解决方案1】:

使用String.format:

String.format("%.2f", 4.52135);

根据文档:

始终使用的语言环境是Locale.getDefault() 返回的语言环境。

【讨论】:

  • String.format 还接受语言环境作为第一个参数来说明十进制符号格式。
  • 为避免特定于区域设置的小数符号(如逗号),请指定美国区域设置:String.format(Locale.US,"%.2f", 4.52135);
  • 我会说“使用美国语言环境特定的点作为十进制符号,指定美国语言环境”.. 这个想法是美国习惯是正确的,其他一切都是“民间”的东西让我发疯。
  • @SimoneGianni 不要做愚蠢的假设,有些人可能需要小数点作为点。例如我正在编写一个导出 CSV 文档的函数,我不能有逗号,因为逗号字符是分隔符。
【解决方案2】:

您可以使用以下任何一种方法

  1. 如果您使用的是java.text.DecimalFormat

    DecimalFormat decimalFormat = NumberFormat.getCurrencyInstance(); 
    decimalFormat.setMinimumFractionDigits(2); 
    System.out.println(decimalFormat.format(4.0));
    

    DecimalFormat decimalFormat =  new DecimalFormat("#0.00"); 
    System.out.println(decimalFormat.format(4.0)); 
    
  2. 如果你想转换成简单的字符串格式

    System.out.println(String.format("%.2f", 4.0)); 
    

以上所有代码都会打印出4.00

【讨论】:

    【解决方案3】:

    有很多方法可以做到这一点。这些在下面给出:

    假设您的原始号码如下所示:

     double number = 2354548.235;
    

    使用 NumberFormat:

    NumberFormat formatter = new DecimalFormat("#0.00");
        System.out.println(formatter.format(number));
    

    使用 String.format:

    System.out.println(String.format("%,.2f", number));
    

    使用 DecimalFormat 和模式:

    NumberFormat nf = DecimalFormat.getInstance(Locale.ENGLISH);
            DecimalFormat decimalFormatter = (DecimalFormat) nf;
            decimalFormatter.applyPattern("#,###,###.##");
            String fString = decimalFormatter.format(number);
            System.out.println(fString);
    

    使用 DecimalFormat 和模式

    DecimalFormat decimalFormat = new DecimalFormat("############.##");
            BigDecimal formattedOutput = new BigDecimal(decimalFormat.format(number));
            System.out.println(formattedOutput);
    

    在所有情况下,输出将是: 2354548.23

    注意

    在舍入期间,您可以在格式化程序中添加RoundingMode。以下是一些舍入模式:

        decimalFormat.setRoundingMode(RoundingMode.CEILING);
        decimalFormat.setRoundingMode(RoundingMode.FLOOR);
        decimalFormat.setRoundingMode(RoundingMode.HALF_DOWN);
        decimalFormat.setRoundingMode(RoundingMode.HALF_UP);
        decimalFormat.setRoundingMode(RoundingMode.UP);
    

    这里是导入

    import java.math.BigDecimal;
    import java.math.RoundingMode;
    import java.text.DecimalFormat;
    import java.text.NumberFormat;
    import java.util.Locale;
    

    【讨论】:

      【解决方案4】:

      另一种方法是使用NumberFormat 类中的setMinimumFractionDigits 方法。

      这里你基本上可以指定小数点后要出现多少个数字。

      所以4.0 的输入将产生4.00,假设您指定的数量是 2。

      但是,如果您的 Double 输入包含的数量超过指定的数量,它将采用指定的最小数量,然后再加一位向上/向下舍入的数字

      例如,4.15465454 指定的最小数量为 2 将生成 4.155

      NumberFormat nf = NumberFormat.getInstance();
      nf.setMinimumFractionDigits(2);
      Double myVal = 4.15465454;
      System.out.println(nf.format(myVal));
      

      Try it online

      【讨论】:

        【解决方案5】:

        使用 Java 8,您可以使用 format 方法..:-

        System.out.format("%.2f", 4.0); // OR
        
        System.out.printf("%.2f", 4.0); 
        
        • f 用于floating 点值..
        • 2 表示小数点后,. 后的小数位数

        对于大多数 Java 版本,您可以使用DecimalFormat:-

            DecimalFormat formatter = new DecimalFormat("#0.00");
            double d = 4.0;
            System.out.println(formatter.format(d));
        

        【讨论】:

          【解决方案6】:

          100% 有效。

          import java.text.DecimalFormat;
          
          public class Formatting {
          
              public static void main(String[] args) {
                  double value = 22.2323242434342;
                  // or  value = Math.round(value*100) / 100.0;
          
                  System.out.println("this is before formatting: "+value);
                  DecimalFormat df = new DecimalFormat("####0.00");
          
                  System.out.println("Value: " + df.format(value));
              }
          
          }
          

          【讨论】:

            【解决方案7】:

            使用 String.format,您可以这样做:

            double price = 52000;
            String.format("$%,.2f", price);
            

            注意与@Vincent 的回答不同的逗号

            输出:

            $52,000.00

            一个很好的格式化资源是关于主题的official java 页面

            【讨论】:

              【解决方案8】:

              我知道这是一个老话题,但是如果您真的喜欢使用句号而不是逗号,只需将您的结果保存为 X,00 到一个字符串中,然后只需将其更改一个句点,这样您就可以得到X.00

              最简单的方法就是使用替换。

              String var = "X,00";
              String newVar = var.replace(",",".");
              

              输出将是您想要的 X.00。此外,为了方便起见,您可以一次完成所有操作并将其保存到双变量中:

              Double var = Double.parseDouble(("X,00").replace(",",".");
              

              我知道这个回复现在没有用,但也许查看这个论坛的人会寻找这样的快速解决方案。

              【讨论】:

                【解决方案9】:

                首先导入NumberFormat。然后添加:

                NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance();
                

                如果涉及货币,这将给你两位小数并加上一个美元符号。

                import java.text.NumberFormat;
                public class Payroll 
                {
                    /**
                     * @param args the command line arguments
                     */
                    public static void main(String[] args) 
                    {
                    int hoursWorked = 80;
                    double hourlyPay = 15.52;
                
                    double grossPay = hoursWorked * hourlyPay;
                    NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance();
                
                    System.out.println("Your gross pay is " + currencyFormatter.format(grossPay));
                    }
                
                }
                

                【讨论】:

                • 问题不是关于显示货币,而是通过使用格式化函数更准确地回答),如其他答案中所述)。
                【解决方案10】:

                您始终可以使用静态方法printf from System.out - 然后您将实现相应的格式化程序;这节省了其他示例需要您执行的堆空间。

                例如:

                System.out.format("%.4f %n", 4.0); 
                
                System.out.printf("%.2f %n", 4.0); 
                

                节省了堆空间,这是一个很大的好处,但我认为这个例子比任何其他答案都更易于管理,特别是因为大多数程序员都知道 C 中的 printf 函数(尽管 Java 稍微改变了函数/方法) .

                【讨论】:

                • @Baz 我在这里遗漏了一个关键细节吗,没有提到 printStream。 OP 正在向标准输出流寻求格式化帮助(可以通过查看 Java 文档更容易地解决)。解释一下。
                • 我的错。正在查看错误的 javadoc 版本(1.4)。顺便说一句:outPrintStream
                • @Baz 不用担心。是的,我假设这就是您所指的类,在我所有的书中 printf 都被称为 System.out 中的静态方法(因为这些方法是静态的)。
                • 准确来说printfPrintStream的静态方法。请参阅here ;) 但仍然 +1。
                • @Baz 从文档中 printStream 类继承了 System.out。我可能是错的 - 尽管继承静态方法很奇怪(甚至可能)?不过,我希望你是正确的。
                【解决方案11】:
                double d = 4.0;
                DecimalFormat nf = DecimalFormat.getInstance(Locale.ENGLISH);
                System.out.println(nf.format("#.##"));
                

                【讨论】:

                  【解决方案12】:

                  其中一种方法是使用NumberFormat

                  NumberFormat formatter = new DecimalFormat("#0.00");     
                  System.out.println(formatter.format(4.0));
                  

                  输出:

                  4.00

                  【讨论】:

                  • 是的,但我不想要逗号,我想要一个小数点。
                  • 我得到一个逗号。这就是我所做的。 "双变量; NumberFormat 格式化程序 = new DecimalFormat("#0.00"); System.out.println(formatter.format(variable));
                  • 你得到一个逗号是因为你的 JVM 使用的默认语言,这可能与 Nambari 的不同。看看 NumberFormat javadoc:docs.oracle.com/javase/1.4.2/docs/api/java/text/…
                  • 正如 zim2001 指出的那样,您的语言环境可能不同。阅读我的答案中提供的链接。最后,您将找到有关此的信息。
                  • (可选)您可能希望在逗号前为超过 3 位的数字添加另一个分隔符,然后使用以下 NumberFormat formatter = new DecimalFormat("#,000.00"); System.out.println(formatter.format(4.0));
                  【解决方案13】:

                  你可以这样做:

                  double d = 4.0;
                  DecimalFormat df = new DecimalFormat("#.##");
                  System.out.print(df.format(d));
                  

                  【讨论】:

                  • 不起作用,因为它使用的是## 而不是00
                  【解决方案14】:
                  new DecimalFormat("#0.00").format(4.0d);
                  

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2017-11-11
                    • 2013-02-27
                    • 1970-01-01
                    • 2013-01-23
                    相关资源
                    最近更新 更多