NumberFormat în Java

Formatează numere după regulile unei limbi (1.234,5 în română, 1,234.5 în engleză); getInstance îl creează, format îl aplică.

Sintaxă
import java.text.NumberFormat;

static NumberFormat getInstance()
static NumberFormat getInstance(Locale locale)
String format(long numar)
String format(double numar)
Number parse(String text) throws ParseException

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 NumberFormat pentru calcule cu bani. Formatarea doar afișează; pentru sume exacte folosește BigDecimal.
  • Folosești același obiect NumberFormat din 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.