24.6. Formatering af tal og beløb

Denne sektion går i dybden med den lokalafhængige klasse java.text.NumberFormat som er velegnet til at formatere tal, beløb og procentstørrelser.

24.6.1. Prædefineret formater

Klassen NumberFormat indeholder en række statiske fabriksmetoder, som returnerer specialiseret formateringsobjekter.

getInstance() 
getInstance(Locale locale) 
getCurrencyInstance() 
getCurrencyInstance(Locale locale) 
getIntegerInstance() 
getIntegerInstance(Locale locale) 
getNumberInstance() 
getNumberInstance(Locale locale) 
getPercentInstance() 
getPercentInstance(Locale locale) 

getInstance(..) er synonym med getNumberInstance(..), og returnerer det normale lokalafhængige NumberFormat-objekt. getCurrencyInstance(..) er beregnet til beløb, getIntegerInstance(..) til heltal og getPercentInstance(..) til procentstørrelser.

Uanset om man arbejder med heltal eller decimaltal så kan det være nyttigt at justere på antallet af cifre der skal vises før og efter et eventuelt decimaltegn. I Danmark er det f.eks. meget normalt at beløbsstørrelser vises med præcis to betydende decimaler. Dette hjælper følgende metoder med:

setMaximumIntegerDigits(int vaerdi) 
setMinimumIntegerDigits(int vaerdi) 
setMaximumFractionDigits(int vaerdi) 
setMinimumFractionDigits(int vaerdi) 

De to første metoder omhandler heltalsdelen af et tal, men de to andre omhandler decimaldelen. setMaximumXXX(8) betyder at der vises højest 8 cifre i enten heltal- eller decimaldelen, mens setMinimumXXX(2) betyder at der vises mindst 2 cifre. Overskydende cifre skæres væk mens manglende cifre erstattes med nuller.

Nedenstående eksempel viser brugen af NumberFormat-klassen.

package dk.sslug;

import java.util.Locale;
import java.text.DecimalFormat;
import java.text.NumberFormat;

public class Talformatering
{
  public static void main(String[] args)
  {
    Locale[] locales = NumberFormat.getAvailableLocales();
    for (int i = 0; i < locales.length; i++) {
      System.out.println(locales[i].toString());
      formaterTal(locales[i]);
      formaterBeloeb(locales[i]);
      formaterProcent(locales[i]);
      System.out.println();
    }
  }
  
  public static void formaterTal(Locale locale) {
    NumberFormat nf = NumberFormat.getNumberInstance(locale);
    String heltal     = nf.format(123456789);
    String decimaltal = nf.format(123456.789);
    System.out.println(heltal);
    System.out.println(decimaltal);
  }
  
  public static void formaterBeloeb(Locale locale) {
    NumberFormat cf = NumberFormat.getCurrencyInstance(locale);
    cf.setMaximumFractionDigits(2);
    String beloeb = cf.format(123456.789);
    System.out.println(beloeb);
  }
  
  public static void formaterProcent(Locale locale) {
    NumberFormat pf = NumberFormat.getPercentInstance(locale);
    String procent = pf.format(1.42);
    System.out.println(procent);
  }
}

Eksemplet gennemløber alle lokalindstillinger, som NumberFormat explicit kender. Et udsnit af resultatet ved at køre ovenstående program er vist her forneden.

...

da
123.456.789
123.456,789
¤ 123.456,79
142%

da_DK
123.456.789
123.456,789
kr 123.456,79
142%

...

en_CA
123,456,789
123,456.789
$123,456.79
142%

en_GB
123,456,789
123,456.789
£123,456.79
142%

...