我试图将BigInteger数字格式化为更人性化的形式
示例:
1000 - > 1.000K
5821 - > 5.821K
10500 - > 10.500K
101800 - > 101.800K
2000000 - > 2.000M
7800000 - > 7.800M
92150000 - > 92.150M
123200000 - > 123.200M
1 000 000 000 000 000 000 - > 1.000E
1 000 000 000 000 000 000 000 - > 1.000Z
1 000 000 000 000 000 000 000 000 - > 1.000Y
611 781 555 431 000 000 000 000 000 - > 611.781Y
我看到一个使用long值的方法,但为了我的目的,长期无法存储足够大的值,所以我必须使用BigInteger
s。如何使用BigInteger以这种方式格式化它?
在我的情况下,它应该处理的最大金额是:
1 000 000 000 000 000 000 000 000 000,格式为1.000B
<子>
修改的
不,这不是this post的重复。我必须使用BigInteger才能工作,必须使用BigInteger完成。较长的值(正如另一篇文章所要求的那样)与我需要的值相比,存储的值不够大
子>
答案 0 :(得分:3)
除以值,直到检索到小于1000的值 通过分割的次数确定后缀(K,M等) 使用最后一个除法的余数确定小数。
例如:
public String formatNumber(BigInteger value)
{
// Initialize suffixes
String[] suffixes = new String[]{null, 'k', 'M', ....};
// Initialize divider
BigInteger thousand;
thousand = new BigInteger(1000);
// Initialize divisions
BigInteger final_value;
BigInteger remainder;
int nr_divisions;
final_value = value;
remainder = null;
nr_divisions = 0;
// Divide until final value less then 1000
BigInteger[] division;
while (final_value.compareTo(thousand) >= 0)
{
division = final_value.divideAndRemainder(thousand);
final_value = division[0];
remainder = division[1];
nr_divisions++;
}
// Maybe no divisions
if (nr_divisions == 0)
return (value.toString());
// Determine suffix
// Some check required since number of divisions may exceed the number of suffixes provided
String suffix;
suffix = suffixes[nr_divisions];
// Compose string
return (final_value.toString() + "." + String.format("%03d", remainder.intValue()) + suffix);
} // formatNumber
答案 1 :(得分:2)
从BigInteger到字符串:How to convert locale formatted number to BigInteger in Java?
之后你需要这样的东西(需要改进):
public static void main(String[] args) throws Exception {
print("1.034");
print("21.034.234");
print("1.034.234.321");
}
private static String convert(String points) {
String[] letters = new String[]{"k", "M", "G"};
int size = points.length();
String after = points;
if (size > 3) {
int firstPoint = points.indexOf(".");
after = points.substring(0, firstPoint + 4);
int x = (size - firstPoint - 3)/4;
after += letters[x];
}
return after;
}
static void print(String x) {
System.out.println(x + " is " + convert(x));
}
编写一段代码(例如少于20行)真的不那么难了