【问题标题】:Format float to maximum N decimal places将浮点数格式化为最多 N 个小数位
【发布时间】:2016-09-09 00:48:33
【问题描述】:

我想将一个数字格式化为最多 N 个小数位。有another similar and popular question here,但这不是我要找的。​​p>

我正在寻找这样的东西,假设我想要最大。 2 个地方,所以这将是:

1.00  -> "1"    (not "1.00")
1.20  -> "1.2"  (not "1.20")
1.23  -> "1.23"
1.234 -> "1.23"
1.235 -> "1.24"

与另一个问题的不同之处在于,如果我不需要它们,我不希望逗号后面的尾随零。

我想知道这是否适用于 String.format(),不适用于 Math.round() 或 DecimalFormat。上面显示的另一个问题提供了使用 DecimalFormat 的解决方案。

答案不需要是变量,给定 N 作为参数。我只是选择了N作为例子。

【问题讨论】:

  • 请看你提到的问题的第二个答案。
  • 看看using BigDecimal(您链接到的问题的答案之一)
  • 发布解决方案只使用 String.format();
  • @Arkadiy - 第二个答案是 DecimalFormat,而不是 String.format(),对吧?
  • 你可以使用 DecimalFormat 和%s

标签: java floating-point numbers format


【解决方案1】:

您可以使用DecimalFormat

引用文档:

您可以使用 DecimalFormat 类将十进制数字格式化为特定于语言环境的字符串。此类允许您控制前导零和尾随零、前缀和后缀、分组(千)分隔符和小数分隔符的显示。

井号 (#) 表示数字,句点是小数的占位符 分隔符。

public void test(){
    DecimalFormat df = new DecimalFormat("#.##");
    System.out.println(df.format(1.00));
    System.out.println(df.format(1.20));
    System.out.println(df.format(1.23));
    System.out.println(df.format(1.234));
    System.out.println(df.format(1.235));
}

输出:

1
1.2
1.23
1.23
1.24

更新:由于您更新了问题并且想要使用 String.format,因此在 SO 中搜索找到了这个 thread 并利用了技巧加正则表达式。所以,你可以使用这样的东西:

public static void main (String[] args) throws java.lang.Exception
{
    System.out.println(fmt(1.00));
    System.out.println(fmt(1.20));
    System.out.println(fmt(1.23));
    System.out.println(fmt(1.234));
    System.out.println(fmt(1.235));
}

public static String fmt(double d)
{
    if(d == (long) d)
        return String.format("%d",(long)d);
    else
        return String.format("%.2f",d).replaceAll("0*$", "");
}

输出是:

1
1.2
1.23
1.23
1.24

无论如何,我会改用 DecimalFormat

【讨论】:

  • N 的小数位如何计算?
  • @4castle 只需确保格式字符串中的小数点后有 N # 符号即可。
  • 有没有办法使用格式化程序对其进行编码,或者您是否必须使用StringBuilder 在循环中构造模式?
  • @4castle:您可以根据需要放置多个########。只需将 1 作为 OP 示例。如果 # 被找到然后它被使用,不是什么都没有发生。与使用 00#.##00 不同,它将用零填充剩余的字符
  • 我从一开始就提到的另一个问题有一个使用 DecimalFormat 的解决方案。我想知道 String.format() 的解决方案是什么,假设有一个。
【解决方案2】:

如果您仍想使用String.format() 进行此操作,另一种解决方案是:

Java 代码:ParseN.java

public class ParseN{

     public static void main(String []args){
        System.out.println(parseN(1.00));
        System.out.println(parseN(1.20));
        System.out.println(parseN(1.23));
        System.out.println(parseN(1.234));
        System.out.println(parseN(1.235));
     }

     static String parseN(Double d)
     {
       String s = String.format("%.2f", d);
       s = s.indexOf(".") < 0 ? s : s.replaceAll("0*$", "").replaceAll("\\.$", "");
       return s;
     }
}

输出:

1
1.2
1.23
1.23
1.24

希望它能完全回答您的问题。另外,请参考this

【讨论】:

  • 您可以将 2 个正则表达式合并为 \\.?0*$。此外,生成的字符串中总会有一个小数点,因此不需要 indexOf 三元。如果您将N 放入格式字符串中,这可能是迄今为止最完整的答案。
【解决方案3】:

您还可以使用setMaximumFractionDigits(...) 控制DecimalFormat 的格式,如下所示:

double d = 1.234567;
DecimalFormat df = new DecimalFormat();
for (int i = 2; i < 6; ++i) {
  df.setMaximumFractionDigits(i);
  System.out.println(df.format(d));
}

这可能比使用StringBuilder 或类似方法生成格式更适合您的用例。

【讨论】:

  • 默认情况下,DecimalFormat 使用 RoundingMode.HALF_EVEN,它在舍入 5 时会出现意外行为。要解决这个问题,请执行df.setRoundingMode(RoundingMode.HALF_UP);
【解决方案4】:

使用数字格式。

NumberFormat format = NumberFormat.getInstance();
format.setMaximumFractionDigits(2); // or N

System.out.println(format.format(1)); // -> 1
System.out.println(format.format(1.2)); // -> 1.2
System.out.println(format.format(1.23)); // -> 1.23
System.out.println(format.format(1.234)); // -> 1.23
System.out.println(format.format(1.235)); // -> 1.24

NumberFormat 也适用于区域设置,您可以更改舍入模式。

NumberFormat format = NumberFormat.getInstance(Locale.GERMANY);
format.setMaximumFractionDigits(2);
format.setRoundingMode(RoundingMode.CEILING);

System.out.println(format.format(1)); // -> 1
System.out.println(format.format(1.2)); // -> 1,2
System.out.println(format.format(1.23)); // -> 1,23
System.out.println(format.format(1.234)); // -> 1,24
System.out.println(format.format(1.235)); // -> 1,24

【讨论】:

  • 第二个区块中的formatter 有一个小问题。应该是format
猜你喜欢
  • 2011-07-08
  • 1970-01-01
  • 2011-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-17
  • 1970-01-01
  • 2020-07-28
相关资源
最近更新 更多