【问题标题】:How to use decimal format to hide trailing zero only in integer numbers [duplicate]如何使用十进制格式仅在整数中隐藏尾随零[重复]
【发布时间】:2020-11-02 10:25:39
【问题描述】:

我需要这样的格式数字:

23.0 -> 23
23.20 -> 23.20
23.00 -> 23
23.11 -> 23.11
23.2 -> 23.20
23.999 -> 24
23.001 -> 23
1345.999 -> 1346 // Edited the question to add this from the OP's comment

这是我的代码: 爪哇:

  public static String toPrice(double number) {
         DecimalFormatSymbols formatSymbols = new DecimalFormatSymbols();
            formatSymbols.setGroupingSeparator(' ');
            DecimalFormat format = new DecimalFormat("#,###,###.##", formatSymbols);
            return format.format(number);
    
         }

科特林:

fun Double.toPrice(): String =   DecimalFormat("#,###,###.##", DecimalFormatSymbols().apply {
                groupingSeparator = ' '
            }).format(this)

但是对于输入 23.20 或 23.2,我得到的结果是 23.2。这对我来说是错误的。我需要 23.20。我应该使用哪种字符串模式来实现这个结果?请帮帮我。

【问题讨论】:

  • 您错误地使用了“模式”一词。在编程中,设计模式是解决特定问题的非常具体的示例。尽管我认为您错了,但您只需要一些格式化方面的帮助。将数字显示为 21.00 表示您知道该数字的精度高于仅显示为 21 的数字。
  • @NomadMaker DecimalFormat 类始终将其字符串模板称为“模式”;在这种情况下,构造函数参数称为pattern。因此,这样称呼它似乎是完全合理的。 (设计模式不是唯一的模式。)
  • @ArvindKumarAvinash 你说的不正确。链接问题的(我的)答案为23.20 的输入生成23.20,并且也满足所有其他示例。这与 Cenfracee 的答案非常相似。除了特别提到DecimalFormat,这个问题是重复的。我认为DecimalFormat 不是合适的工具或这里的工作,String.format() 要简单得多。
  • 哦,问题又被打开了。这是副本:Print float with two decimals unless number is a mathematical integer.
  • @ArvindKumarAvinash 删除 cmets 时很难回复。在23.001 的情况下,上面帖子中的答案将产生23,这是所需要的。

标签: java kotlin double decimalformat


【解决方案1】:
public static String toPrice(double number) {
    if (number == (int) number) {
        return Integer.toString((int) number);
    } else {
        return String.format("%.2f", number);
    }
}

编辑
包含千位分隔符

public static String toPrice(double number) {
    if (number == (int) number) {
        return String.format("%,d",(int)number);
    } else {
        return String.format("%,.2f", number);
    }
}

【讨论】:

  • 谢谢你的回答,但我需要用千位分隔符显示价格
  • 检查编辑后的答案
【解决方案2】:

更新

如果您需要将1345.999 格式化为1346(如您的评论中所述),您可以通过在原始答案中添加几个额外步骤来实现:

  1. 使用模式#,###,###.00 格式化数字,然后删除所有逗号,以便可以将其解析回双精度。
  2. 将转换后的字符串解析为double,然后按照原始答案中提到的其余解决方案进行操作。

演示:

import java.text.DecimalFormat;
import java.text.NumberFormat;

public class Main {
    public static void main(String[] args) {
        System.out.println(getFromattedNumber(1234567.0));
        System.out.println(getFromattedNumber(1234567.20));
        System.out.println(getFromattedNumber(1234567.01));
        System.out.println(getFromattedNumber(1234567.00));
        System.out.println(getFromattedNumber(1345.999));
    }

    static String getFromattedNumber(double number) {
        NumberFormat format = new DecimalFormat("#,###,###.00");
        double num = Double.parseDouble(format.format(number).replace(",", ""));

        // Format for integer decimal numbers
        NumberFormat formatInt = new DecimalFormat("#,###,###");

        if ((int) num == num) {
            return formatInt.format(number);
        } else {
            return format.format(number);
        }
    }
}

输出:

1,234,567
1,234,567.20
1,234,567.01
1,234,567
1,346

原答案

您将需要使用如下所示的两种格式:

import java.text.DecimalFormat;
import java.text.NumberFormat;

public class Main {
    public static void main(String[] args) {
        System.out.println(getFromattedNumber(1234567.0));
        System.out.println(getFromattedNumber(1234567.20));
        System.out.println(getFromattedNumber(1234567.01));
        System.out.println(getFromattedNumber(1234567.00));
    }

    static String getFromattedNumber(double number) {
        // Format for integer decimal numbers
        NumberFormat format1 = new DecimalFormat("#,###,###");

        // Format for non-integer decimal numbers
        NumberFormat format2 = new DecimalFormat("#,###,###.00");

        if ((int) number == number) {
            return format1.format(number);
        } else {
            return format2.format(number);
        }
    }
}

输出:

1,234,567
1,234,567.20
1,234,567.01
1,234,567

【讨论】:

  • DecimalFormat 默认使用 RoundingMode.HALF_EVEN (根据我的需要),例如,当我的值为 1345.999 时,我得到结果 1 346.00(最后两个零,不正确)
  • @testovtest - 1346.00 是使用RoundingMode.HALF_EVEN 的正确结果。检查this 以获得解释。如果您需要将1345.999 格式化为1345.99,请使用RoundingMode.FLOOR。
  • 对于输入 1345.999 我需要输出 1346(四舍五入但末尾没有零)
  • @testovtest - 我已经发布了一个更新来满足这个要求。如有任何疑问/问题,请随时发表评论。
猜你喜欢
  • 2016-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-26
  • 2015-05-31
  • 2011-02-12
  • 2021-09-13
  • 2015-01-31
相关资源
最近更新 更多