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)
}
我目前的格式是这样的
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)
}