微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Kotlin/Java 格式化双精度值

如何解决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
 }

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。