Как форматировать длинные числа?

Если у меня есть число 100000000, как я могу представить это как «100M» в строке?


person Sheehan Alam    schedule 09.09.2010    source источник
comment
Это похоже, но не совсем дубликат: stackoverflow.com / questions / 529432 /   -  person Aaron Novstrup    schedule 09.09.2010
comment
Вот класс, который делает нечто подобное: jcs.mobile-utopia.com/jcs/5242_ScaledNumberFormat. java, к сожалению, он не входит в поддерживаемую библиотеку.   -  person oksayt    schedule 09.09.2010
comment
Ни один из ответов не рассматривает i18n!   -  person jwl    schedule 30.01.2014


Ответы (4)


Насколько мне известно, в библиотеке нет поддержки для сокращения чисел, но вы можете легко сделать это самостоятельно:

NumberFormat formatter = NumberFormat.getInstance();
String result = null;
if (num % 1000000 == 0 && num != 0) {
   result = formatter.format(num / 1000000) + "M";
} else if (num % 1000 == 0 && num != 0) {
   result = formatter.format(num / 1000) + "K";
} else {
   result = formatter.format(num);
}

Конечно, это предполагает, что вы не хотите сокращать число, например, 1234567,89. Если вы делаете, то этот вопрос является дубликатом.

person Aaron Novstrup    schedule 09.09.2010

Для этого есть алгоритм:

Вам нужна карта, которая выглядит как

2 => "hundred"
3 => "thousand"
6 => "million"
9 => "billion"
12 => "trillion"
15 => "quadrillion"

... и так далее...

1) Возьмите число «num», вычислите показатель «ex» log10 числа и уменьшите его.

Внимание

log10 (0) не существует, поэтому убедитесь, что число не равно 0, и, поскольку нет смысла выводить что-то вроде 20 = "2 десять", вы должны вернуть число, как оно есть, если оно меньше 100!

2) Теперь выполните итерацию по ключам хэш-карты выше и посмотрите, совпадает ли ключ, если нет, возьмите ключ, который меньше экспоненты «ex».

3) Обновите "ex" до этого ключа!

4) Теперь отформатируйте число как

число = число / мощность (10; пример)

(!! ex - это ключ хеш-карты !!)

5) теперь можно округлить число до определенной точности и вывести num + yourHash[ex]

Пример:

number = 12345.45
exponent = floor(log10(12345.45))

exponent should now be 4 !

look for a key in the hash map -- whoops no key matches 4 ! -- so take 3 !

set exponent to 3 

now you scale the number:

number = number / pow(10, exponent)

number = 12345.45 / pow(10, 3) 

number = 12345.45 / 1000

number is now 12.34545

now you get the value to the corresponding key out of the hash map

the value to the key, which is 3 in this example, is thousand  

so you output 12.34545 thousand
person sled    schedule 09.09.2010

Вот мое решение, чтобы сделать его более общим:

private static final String[] magnitudes = new String[] {"", "K", "M"};

public static String shortenNumber(final Integer num) {
    if (num == null || num == 0) 
        return "0";

    float res = num;
    int i = 0;
    for (; i < magnitudes.length; i++) {
        final float sm = res / 1000;
        if (sm < 1) break;

        res = sm;
    }


    // don't use fractions if we don't have to
    return ( (res % (int) res < 0.1) ?
                String.format("%d", (int)res) :
                String.format("%.1f", res)
            ) 
            + magnitudes[i];
}
person phreakhead    schedule 09.04.2013

Это более общее решение.

public static String abbreviateNumber(long num) {

    long temp = num / 1000000; 
    if(temp > 0) {
        return temp + "M+";
    }

    temp = num / 1000;
    if (temp > 0) {
        return temp + "K+";
    }

    temp = num / 500;
    if (temp > 0) {
        return  "500+";
    }

    temp = num / 100;
    if (temp > 0) {
        return  "100+";
    }

    temp = num / 50;
    if (temp > 0) {
        return  "50+";
    }

    temp = num / 10;
    if (temp > 0) {
        return  "10+";
    }

    return String.valueOf(num);
}
person Rohit Sharma    schedule 19.02.2016