我有这个格式化大数字的功能。
public static String ToEngineeringNotation(Double d, String unit, int decimals) {
double exponent = Math.log10(Math.abs(d));
if (d != 0)
{
String result = "0";
switch ((int)Math.floor(exponent))
{
case -2: case -1: case 0: case 1: case 2:
result = (d + "").replace(".", ",") + " " + unit;
break;
case 3: case 4: case 5:
result = ((d / 1e3) + "").replace(".", ",") + " k" + unit;
break;
case 6: case 7: case 8:
result = ((d / 1e6) + "").replace(".", ",") + " M" + unit;
break;
default:
result = ((d / 1e9) + "").replace(".", ",") + " G" + unit;
break;
}
if (result.contains(",")) {
if (result.indexOf(" ") - result.indexOf(",") >= decimals) {
result = result.substring(0, result.indexOf(",") + decimals + 1) + result.substring(result.indexOf(" "));
}
if (decimals <= 0)
result = result.replace(",", "");
}
return result;
} else {
return "0 " + unit;
}
}
如果我提供3866500.0
我想获得3.9 M
,而我得到的是3,8 M
,因为算法不会舍入到最接近的上限值。我不知道如何做到这一点。
有什么想法吗?
答案 0 :(得分:1)
哦,问题是您在删除小数字后将其设为字符串。换句话说,更容易做到这一点,换句话说:
case 6: case 7: case 8:
double divide = (d / 1e6d) * ;
double roundFactor = Math.pow(10, decimals);
result = (Math.round(divide * roundFactor) / roundFactor) + "").replace(".", ",") + " M" + unit;
break;
这不是最干净的方式,但我想向您展示这个想法。用数学进行舍入,而不是字符串。
答案 1 :(得分:1)
我建议将您的数据转换为java.math.BigDecimal。它有几种舍入模式,包括向正无穷大四舍五入。我相信从十进制缩放表示开始,您的格式化会更容易。
答案 2 :(得分:1)
我建议使用java.text.NumberFormat:
public static String ToEngineeringNotation(double d, String unit, int decimals) {
String m = "";
if (d > 1000000000) {
d = d / 1000000000;
m = " G";
} else if (d > 1000000) {
d = d / 1000000;
m = " M";
} else if (d > 1000) {
d = d / 1000;
m = " K";
}
NumberFormat f = NumberFormat.getInstance();
f.setGroupingUsed(false);
f.setMinimumFractionDigits(decimals);
f.setMaximumFractionDigits(decimals);
return f.format(d) + m + " " + unit;
}
请注意,NumberFormat将根据您的语言环境选择小数分隔符,这可能是您想要的。如果你想要它总是逗号,那么使用NumberFormat.getInstance(Locale.GERMAN)