Kotlin/Java 格式化双精度值

问题描述

我目前的格式是这样的

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

但确保上面的代码不能用于非零值从千位开始的小数部分,否则我将最终显示 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

解决方法

尝试将数字乘以 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)
}
,

您可以这样做以减少尾随 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
 }

你只需要知道你的十进制数字应该检查多远。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...