【问题标题】:Kotlin/Java formatting Double valuesKotlin/Java 格式化 Double 值
【发布时间】:2021-04-21 12:28:36
【问题描述】:

我目前的格式是这样的

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

【问题讨论】:

  • 格式化背后的逻辑是什么?是否要将数字四舍五入到前两位非零小数?
  • 其实我也有同样的问题。为什么您的精度要求会根据值而变化?我无法理解您的用例,因为您可以忽略上一个示例0.00234567 -> 0.0023 中的数字4,但在您的另一个示例0.00004 中它似乎足够重要。是什么让 前面的 0 在这里如此特别?
  • @Joffrey 我不确定有什么令人困惑的地方,或者您可能认为这是一种不好的做法。我不想显示这么长时间的0.00023232323345345345。我只想要前两个非零。它不是关于前面的零,对吗?
  • 但也可以使用18888.8888 为18,888.88 或0.0543 为0.054 就这么简单
  • @UrbanR 舍入不是必需的,但也欢迎

标签: kotlin formatting double decimal decimalformat


【解决方案1】:

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

【讨论】:

  • 我们怎么能说我们已经把它分解成最后两个非零?
  • 只需将其乘以 10 后进行比较。如果不等于 0,则得到第一个非零数字,然后将其再次乘以 10,并检查新数字是否可被 10 整除如果不是,你知道下一个数字也不为零。
  • 愿意为您提供整个解决方案,以便我们在实际中对其进行测试?
  • 顺便说一下,我稍微更新了这个问题,因为@Joffrey 越来越混乱,因为它应该取决于前面的零
  • @BitwiseDEVS 用整个函数编辑了我的答案。
【解决方案2】:

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

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

【讨论】:

  • 我认为这不会解决 OP 的最后一个案例。
  • 你是对的。在这种情况下,我会做一个简单的解决方法,按照说明格式化数字,并在使用 REGEX 显示 2 个非 0 数字后将其切断..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-16
  • 2011-05-21
  • 2018-12-30
  • 1970-01-01
相关资源
最近更新 更多