【问题标题】:How to Java String.format with a variable precision?如何以可变精度进行 Java String.format?
【发布时间】:2011-01-19 01:15:48
【问题描述】:

我想根据用户输入改变我正在格式化的字符串中双精度表示的精度。现在我正在尝试类似的东西:

String foo = String.format("%.*f\n", precision, my_double);

但是我收到了java.util.UnknownFormatConversionException。我对这种方法的灵感来自 C printf 和 this resource(第 1.3.1 节)。

我在某处是否有简单的语法错误,Java 是否支持这种情况,或者有更好的方法吗?

编辑:

我想我可以这样做:

String foo = String.format("%." + precision + "f\n", my_double);

但我仍然对此类操作的原生支持感兴趣。

【问题讨论】:

    标签: java string rounding precision floating-accuracy


    【解决方案1】:

    您回答了自己的问题 - 动态构建格式字符串...有效的格式字符串遵循此处概述的约定:http://java.sun.com/j2se/1.5.0/docs/api/java/util/Formatter.html#syntax

    如果您想要一个占用 8 个总字符(包括小数点)的格式化小数,并且您想要小数点后 4 个数字,那么您的格式字符串应该类似于“%8.4f”...

    据我所知,除了格式字符串灵活之外,Java 中没有“原生支持”。

    【讨论】:

      【解决方案2】:

      您可以使用DecimalFormat 类。

      double d1 = 3.14159;
      double d2 = 1.235;
      
      DecimalFormat df = new DecimalFormat("#.##");
      
      double roundedD1 = df.format(d); // 3.14
      double roundedD2 = df.format(d); // 1.24
      

      如果您想在运行时调用时设置精度:

      df.setMaximumFractionDigits(precision)
      

      【讨论】:

      • 更重要的是df.format(42)简单地返回42
      【解决方案3】:

      为什么不:

      String form = "%."+precision+"f\n";
      String foo = String.format(form, my_double);
      

      或:

      public static String myFormat(String src, int precision, Object args...)
      {
          String form = "%."+precision+"f\n";
          return String.format(form, args);
      }
      

      【讨论】:

      • 所以你建议 OP 一些他已经知道并在他的问题中添加的东西?
      • 我主要建议 OP 制作自己的静态函数,该函数将执行他想要的操作(字符串格式的本机函数,包括可变精度)。所以是的,不是的,因为他已经有了这样做的工具。或者至少这就是我想要做的。
      【解决方案4】:
      double pi = Math.PI; // 3.141592653589793
      int n = 5;
      DecimalFormat df = new DecimalFormat();
      df.setMaximumFractionDigits(n);
      System.out.printf(df.format(pi)); // 3.14159
      

      您可以在运行时设置 n 的值。从上面给出的代码中 n = 5 将打印 3.14159

      【讨论】:

        猜你喜欢
        • 2011-06-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-27
        • 1970-01-01
        • 2021-07-25
        • 1970-01-01
        相关资源
        最近更新 更多