如何缩短BigInteger值?

时间:2016-06-05 15:01:02

标签: java biginteger

我试图将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完成。较长的值(正如另一篇文章所要求的那样)与我需要的值相比,存储的值不够大

2 个答案:

答案 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行)真的不那么难了