Як я можу відформатувати номер рядка, щоб у ньому були коми і круглі?


142

Який найкращий спосіб відформатувати наступне число, яке дається мені як String?

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
ви також можете використовувати нижче рішення - загальнодоступне статичне String getRoundOffValue (подвійне значення) {DecimalFormat df = new DecimalFormat ("##, ##, ##, ##, ##, ##, ## 0.00"); повернути df.format (значення); }
Jitendra Nath

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

46

Це також можна досягти, використовуючи 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

Після перетворення String у число ви можете використовувати

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

або

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

Як вказати локал та округнути (сказати) 2 десяткові дроби?
Джонік

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,23М» як вихід. Можливо, я міг би додати підтримку десятків, але я не бачив занадто багато користі для цього, тому я міг би також об'єднати це в клас типу 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 також можуть бути 0. Будь-який спосіб працює.


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.