Ce face NumberFormat
Țările scriu numerele diferit: în România 1.234.567,89, în SUA 1,234,567.89. NumberFormat.getInstance(locale) returnează un formatator pentru limba dată, iar format(numar) produce textul. Fără argument se folosește limba implicită a sistemului.
Implicit sunt afișate cel mult 3 zecimale (cu rotunjire). Le controlezi cu setMinimumFractionDigits și setMaximumFractionDigits. Separatorul de mii se poate opri cu setGroupingUsed(false). Invers, parse(text) citește un număr scris după regulile limbii.
Alte fabrici: getCurrencyInstance (bani), getPercentInstance (procente), getIntegerInstance (întregi) și getCompactNumberInstance (Java 12: „1 mie”, „2 mil.”). Obiectele NumberFormat nu sunt sigure pentru mai multe fire de execuție.
Parametri
| Parametru | Descriere |
|---|---|
locale |
Opțional: limba și țara, de exemplu Locale.of("ro", "RO"). |
numar |
Pentru format: numărul de formatat. |
Ce returnează
getInstance: un NumberFormat. format: un String.
Exemple
Exemplul 1: Același număr în română și în engleză
import java.text.NumberFormat;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
double numar = 1234567.891;
NumberFormat ro = NumberFormat.getInstance(Locale.of("ro", "RO"));
NumberFormat us = NumberFormat.getInstance(Locale.US);
System.out.println("România: " + ro.format(numar));
System.out.println("SUA: " + us.format(numar));
System.out.println("Întreg: " + ro.format(2_500_000));
}
}
Rezultat
România: 1.234.567,891
SUA: 1,234,567.891
Întreg: 2.500.000
Exemplul 2: Zecimale fixe, procente și citire
Setăm exact două zecimale, formatăm un procent și citim înapoi un număr scris în format românesc.
import java.text.NumberFormat;
import java.text.ParseException;
import java.util.Locale;
public class Main {
public static void main(String[] args) throws ParseException {
Locale ro = Locale.of("ro", "RO");
NumberFormat doua = NumberFormat.getInstance(ro);
doua.setMinimumFractionDigits(2);
doua.setMaximumFractionDigits(2);
System.out.println(doua.format(7.5) + " | " + doua.format(1999.999));
NumberFormat procent = NumberFormat.getPercentInstance(ro);
System.out.println("Promovabilitate: " + procent.format(0.873));
Number citit = NumberFormat.getInstance(ro).parse("12.345,67");
System.out.println("Citit: " + citit.doubleValue());
}
}
Rezultat
7,50 | 2.000,00
Promovabilitate: 87 %
Citit: 12345.67
Greșeli frecvente
- Te bazezi pe limba implicită: același program afișează altfel pe un server setat în engleză. Dă explicit
Locale-ul. - Folosești
NumberFormatpentru calcule cu bani. Formatarea doar afișează; pentru sume exacte foloseșteBigDecimal. - Folosești același obiect
NumberFormatdin mai multe fire de execuție: rezultatele se pot amesteca.
Comenzi înrudite
NumberFormat.getCurrencyInstance: Formatează sume de bani cu simbolul și regulile unei țări: 1.234,50 RON pentru România, $1,234.50 pentru SUA.Locale: Reprezintă o limbă și o țară (ro-RO, en-US); spune cum se formatează numere, bani, date și cum se compară textele.PrintStream.printf: Afișează text formatat după un șablon cu %s, %d, %.2f, %n: numere cu zecimale fixe, coloane aliniate.String.format: Construiește un șir dintr-un șablon cu %s, %d, %.2f etc.; formatted() face același lucru pe șablon.