Как я могу отформатировать номер строки, чтобы запятые и круглые?


142

Как лучше всего отформатировать следующее число, которое дается мне как строка?

String number = "1000500000.574" //assume my value will always be a String

Я хочу, чтобы это была строка со значением: 1,000,500,000.57

Как я могу отформатировать его как таковой?

Ответы:


256

Вы можете посмотреть на DecimalFormatкласс; он поддерживает разные локали (например: в некоторых странах, которые будут отформатированы как 1.000.500.000,57вместо).

Вам также необходимо преобразовать эту строку в число, это можно сделать с помощью:

double amount = Double.parseDouble(number);

Пример кода:

String number = "1000500000.574";
double amount = Double.parseDouble(number);
DecimalFormat formatter = new DecimalFormat("#,###.00");

System.out.println(formatter.format(amount));

Можете ли вы показать пример того, как я могу использовать NumberFormat в этом конкретном случае?
Шихан Алам

1
Вы также можете использовать приведенное ниже решение - public static String getRoundOffValue (double value) {DecimalFormat df = new DecimalFormat ("##, ##, ##, ##, ##, ##, ## 0.00"); вернуть df.format (значение); }
Джитендра Натх

Я также предпочитаю ноль перед точкой, как DecimalFormat formatter = new DecimalFormat ("#, ## 0.00"); - получение 0,00 для нуля звучит неправильно для меня
Лев

45

Это также может быть выполнено с помощью String.format (), что может быть проще и / или более гибким, если вы форматируете несколько чисел в одной строке.

    String number = "1000500000.574";
    Double numParsed = Double.parseDouble(number);

    System.out.println(String.format("The input number is: %,.2f", numParsed));
    // Or
    String numString = String.format("%,.2f", numParsed);

Для строки формата "%,. 2f" - "," означает отдельные группы цифр с запятыми, а ".2" означает округление до двух знаков после запятой.

Для получения справки о других параметрах форматирования см. Https://docs.oracle.com/javase/tutorial/java/data/numberformat.html.


42

Как только вы преобразовали свою строку в число, вы можете использовать

// format the number for the default locale
NumberFormat.getInstance().format(num)

или

// format the number for a particular locale
NumberFormat.getInstance(locale).format(num)

Как указать локаль и округлить до, скажем, 2 десятичных знака?
Jonik

6
Ах, неважно, нашел это:new DecimalFormat("0.##", DecimalFormatSymbols.getInstance(locale))
Jonik

16

Учитывая, что это результат Google номер один format number commas java, вот ответ, который работает для людей, которые работают с целыми числами и не заботятся о десятичных дробях.

String.format("%,d", 2000000)

выходы:

2,000,000

также работает для чисел с плавающей точкой, например, printf ("%, f \ n", decimalNumber)
philwalk

12

Я создал свою собственную утилиту форматирования. Который очень быстро обрабатывает форматирование и дает много возможностей :)

Поддерживает:

  • Форматирование запятой Например, 1234567 становится 1,234,567.
  • Префикс «Тысяча (K), Миллион (M), Миллиард (B), Триллион (T)».
  • Точность от 0 до 15.
  • Изменение размера точности (означает, что если вам нужна точность в 6 цифр, но у вас есть только 3 доступные цифры, это приводит к 3).
  • Понижение префикса (означает, что если выбранный префикс слишком велик, он понижает его до более подходящего префикса).

Код можно найти здесь . Вы называете это так:

public static void main(String[])
{
   int settings = ValueFormat.COMMAS | ValueFormat.PRECISION(2) | ValueFormat.MILLIONS;
   String formatted = ValueFormat.format(1234567, settings);
}

Я должен также отметить, что это не обрабатывает десятичную поддержку, но очень полезно для целочисленных значений. В приведенном выше примере будет показано «1.23M». Возможно, я мог бы добавить поддержку десятичной дроби, но с тех пор я не видел в ней особой пользы, поэтому я мог бы также объединить ее с классом типа BigInteger, который обрабатывает сжатые массивы char [] для математических вычислений.


2
Это хорошо, если вы работаете только на английском языке. Мое предложение состоит в том, чтобы избежать такой вещи, как это разозлило обед моих неанглийских пользователей, поскольку они не могли понять, что Kи что Mозначает
rishabhmhjn

@rishabhmhjn но ... не могли бы вы просто настроить его, чтобы изменить любое письмо, которое вам нужно? твоя неудача его вина? : o и то, что он создал, довольно круто, несмотря на то, что ссылка кажется сейчас недоступной ..
Водолей Сила

@ AquariusPower проблема, например, японские числа не соответствуют метрической системе. Их числа как 1 百 для 100, 1 千 для 1000, 1 万 для 10000, затем он становится 1 千万 для 1000,0000. Моя команда работала над чем-то похожим в Javascript. Вы можете использовать логику, упомянутую в этом: github.com/statusbrew/angular-bignumber
rishabhmhjn

Нашел мой старый код для этого, поэтому я перегрузил его на GitHub. Ссылка в комментарии обновлена.
Джереми Трифило

6
public void convert(int s)
{
    System.out.println(NumberFormat.getNumberInstance(Locale.US).format(s));
}

public static void main(String args[])
{
    LocalEx n=new LocalEx();
    n.convert(10000);
}

6

Вы также можете использовать приведенное ниже решение -

public static String getRoundOffValue(double value){

        DecimalFormat df = new DecimalFormat("##,##,##,##,##,##,##0.00");
        return df.format(value);
}

4

Вы можете сделать все преобразования в одну строку, используя следующий код:

String number = "1000500000.574";
String convertedString = new DecimalFormat("#,###.##").format(Double.parseDouble(number));

Последние два знака # в конструкторе DecimalFormat также могут быть 0s. В любом случае работает.


3

Первый ответ работает очень хорошо, но для ZERO / 0 он будет отформатирован как .00

Следовательно, формат #, ## 0,00 хорошо работает для меня. Всегда проверяйте разные числа, такие как 0/100 / 2334.30 и отрицательные числа, перед развертыванием в производственной системе.


3

Вот самый простой способ добраться туда:

String number = "10987655.876";
double result = Double.parseDouble(number);
System.out.println(String.format("%,.2f",result)); 

Выход: 10 987 655,88

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.