【问题标题】:Java - format a decimal to a minimum number of places [duplicate]Java - 将小数格式化为最小位数[重复]
【发布时间】:2021-07-25 23:42:34
【问题描述】:

我正在尝试在 Java 中格式化这样的数字;关于如何做到这一点的任何想法?

11.1230 => "$11.123"
11.1000 => "$11.10"
11.0100 => "$11.01"
11.1234 => "$11.1234"

【问题讨论】:

  • 格式化的标准是什么?
  • 你不能用简单的代码来做到这一点。您必须知道小数部分的数量。

标签: java


【解决方案1】:

限制为 2 位小数

   double d = 11.0100;
    System.out.printf("Double upto 2 decimal places: %.2f",d);

输出:

11.01

【讨论】:

  • 这不是 OP 想要的。 11.1234 应该打印为 11.1234。
【解决方案2】:

你可以使用DecimalFormat:

DecimalFormat format = new DecimalFormat("$#.00##");
System.out.println(format.format(11.1230));
System.out.println(format.format(11.1000));
System.out.println(format.format(11.0100));
System.out.println(format.format(11.1234));

输出:

$11.123
$11.10
$11.01
$11.1234

注意格式字符串中0# 之间的区别,用于必填和可选数字。

参考:API documentation of DecimalFormat

【讨论】:

    【解决方案3】:

    像这样试试。我使用了一个 Lambda,它接受一个精度和一个双精度并返回一个字符串。

    BiFunction<Integer, Double, String> format = (places, val) -> {
        BigDecimal bd = BigDecimal.valueOf(val).stripTrailingZeros();
        if (bd.scale() < places) {
            bd = bd.setScale(places);
        }
        return bd.toString();
    };
    
    
    double[] vals = { 11.1230, 11.1000, 11.0100, 11.1234 };
    for (double val : vals) {
        System.out.printf("$%s%n", format.apply(2, val));
    }
    

    打印

    $11.123
    $11.10
    $11.01
    $11.1234
    

    【讨论】:

    • 可以简写为BigDecimal bd = BigDecimal.valueOf(val).stripTrailingZeros();
    • 完成。有什么可以缩短的。 :) 谢谢!
    猜你喜欢
    • 1970-01-01
    • 2012-02-07
    • 2011-06-04
    • 1970-01-01
    • 1970-01-01
    • 2016-09-09
    • 2015-02-12
    • 2011-05-23
    • 2011-01-10
    相关资源
    最近更新 更多