Kotlin/Java 格式化双精度值

Kotlin/Java formatting Double values

我目前的格式是这样的

DecimalFormat("#,##0.00").format(value)

我需要处理这样的值

0.00 //ok
0.45 //ok
0.002 //Need to show 0.002 or 0.0020
0.0003 //Need to show 0.0003 or 0.00030
0.00004 //Need to show 0.00004 or 0.000040
0.00234567 //Need to show 0.0023

但是可以肯定的是,上面的代码不适用于非零值从第 1000 位开始的小数部分,否则我将最终显示 0.00 就好像它完全是一个零值一样。我仍然希望在处理整数时使用逗号进行上述格式化,但也允许我在非零开始超过百分之一时进行格式化。

更多示例

0.0492 // 0.04 or 0.05 much better
700.356 // 700.35 or 700.36 much better
54232.542234 // 54,232.54

你可以这样做以减少尾巴 0:

public static void main(String []args){
    double number1 = 0.2;
    double number2 = 1.55;
    double number3 = 0.00005;
    double number4 = 0.50000;
    
    DecimalFormat df = new DecimalFormat("###,##0.00#########");
    System.out.println(df.format(number1)); // 0.20
    System.out.println(df.format(number2)); // 1.55
    System.out.println(df.format(number3)); // 0.00005
    System.out.println(df.format(number4)); // 0.50
 }

您只需要知道您的小数位数应该检查多远。

尝试将数字乘以 10,直到您知道有两个非零数字。这样你就会得到你必须四舍五入的小数点位数。

之后,您使用 NumberFormat 来格式化数字,如下所示:

val format = NumberFormat.getInstance()
format.maximumFractionDigits = nrOfDecimalPoints
val formattedNumber = format.format(yourNumber)

这样您将保留千位分隔符“,”,并且小数点将在两个非零数字后被截断。

编辑

自定义函数是这样的:

private fun customFormat(number: Double): String{
    var temp = number - number.toInt()
    temp *= 100
    var nrDec = 2
    if (number <= 0.0){
        return "0.00"
    }
    if (temp >= 1.0){
        val format = NumberFormat.getInstance(Locale.US)
        format.maximumFractionDigits = nrDec
        return format.format(number)
    }
    while (temp < 1.0 && nrDec < 15){
        temp *= 10
        nrDec ++
    }
    if((temp * 10 % 10) != 0.0){
        nrDec++
    }
    val format = NumberFormat.getInstance(Locale.US)
    format.maximumFractionDigits = nrDec
    return format.format(number)
}