Как отформатировать число с разделителями тысяч
Короткий ответ
Флаг , в шаблоне String.format() добавляет разделители групп разрядов:
void main() {
IO.println(String.format(Locale.US, "%,d", 1234567));
IO.println(String.format(Locale.US, "%,.2f", 9876543.219));
}Результат:
1,234,567
9,876,543.22По правилам страны
Разные страны разделяют разряды по-разному. NumberFormat знает эти правила:
void main() {
long population = 83_200_000;
IO.println(NumberFormat.getInstance(Locale.US).format(population));
IO.println(NumberFormat.getInstance(Locale.GERMANY).format(population));
IO.println(NumberFormat.getInstance(Locale.of("ru")).format(population));
}Результат:
83,200,000
83.200.000
83 200 000В русском формате разряды разделяет неразрывный пробел.
Свой шаблон
DecimalFormat задаёт формат шаблоном: # — цифра, если она есть, 0 — цифра всегда:
void main() {
var format = new DecimalFormat("#,##0.00", DecimalFormatSymbols.getInstance(Locale.US));
IO.println(format.format(1234.5));
IO.println(format.format(0.5));
}Результат:
1,234.50
0.50Сокращённая запись
NumberFormat.getCompactNumberInstance() превращает большие числа в короткую запись вроде «2K» и «2M». По умолчанию значение округляется до целого:
void main() {
var format = NumberFormat.getCompactNumberInstance(Locale.US, NumberFormat.Style.SHORT);
IO.println(format.format(1_500));
IO.println(format.format(2_300_000));
}Результат:
2K
2MЧастая ошибка
Разбирать отформатированную строку обратно через parseInt(). Разделители мешают:
void main() {
IO.println(Integer.parseInt("1,234"));
}Результат:
Exception in thread "main" java.lang.NumberFormatException: For input string: "1,234"Используйте NumberFormat.getInstance(Locale.US).parse("1,234") или уберите разделители заранее.
Функции из этого ответа
- String.format() — Собирает строку по шаблону с подстановками вроде %s и %d.
- NumberFormat — Форматирует числа, деньги и проценты по правилам выбранной страны.