简体   繁体   English

格式,double为2位小数,java为整数0位

[英]Format, 2 decimal places for double and 0 for integer in java

I am trying to format a double to exact 2 decimal places if it has fraction, and cut it off otherwise using DecimalFormat 如果它有分数,我试图将double格式化为精确的2位小数,否则使用DecimalFormat将其截断

So, I'd like to achieve next results: 所以,我想获得下一个结果:

100.123 -> 100.12
100.12  -> 100.12
100.1   -> 100.10
100     -> 100

Variant #1 变体#1

DecimalFormat("#,##0.00")

100.1 -> 100.10
but
100   -> 100.00

Variant #2 变种#2

DecimalFormat("#,##0.##")

100   -> 100
but
100.1 -> 100.1

Have any ideas what pattern to choose in my case? 有什么想法可以选择我的案例吗?

The only solution i reached is to use if statement like was mentioned here: https://stackoverflow.com/a/39268176/6619441 我达到的唯一解决方案是使用如下所述的if语句: https//stackoverflow.com/a/39268176/6619441

public static boolean isInteger(BigDecimal bigDecimal) {
    int intVal = bigDecimal.intValue();
    return bigDecimal.compareTo(new BigDecimal(intVal)) == 0;
}

public static String myFormat(BigDecimal bigDecimal) {
    String formatPattern = isInteger(bigDecimal) ? "#,##0" : "#,##0.00";
    return new DecimalFormat(formatPattern).format(bigDecimal);
}

Testing 测试

myFormat(new BigDecimal("100"));   // 100
myFormat(new BigDecimal("100.1")); // 100.10

If someone knows more elegant way, please share it! 如果有人知道更优雅的方式,请分享!

I believe we need an if statement. 我相信我们需要一个if声明。

static double intMargin = 1e-14;

public static String myFormat(double d) {
    DecimalFormat format;
    // is value an integer?
    if (Math.abs(d - Math.round(d)) < intMargin) { // close enough
        format = new DecimalFormat("#,##0.##");
    } else {
        format = new DecimalFormat("#,##0.00");
    }
    return format.format(d);
}

The margin allowed for a number to be regarded as an integer should be chosen according to the situation. 应根据情况选择允许将数字视为整数的余量。 Just don't assume you will always have an exact integer when you expect one, doubles don't always work that way. 只是不要假设你总是会有一个完整的整数,你期望一个,双打并不总是这样。

With the above declaration myFormat(4) returns 4 , myFormat(4.98) returns 4.98 and myFormat(4.0001) returns 4.00 . 使用上面的声明, myFormat(4)返回4myFormat(4.98)返回4.98myFormat(4.0001)返回4.00

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM