2013-03-10 9 views
8

Sto cercando di formattare una stringa per aggiungere le virgole tra i 3 gruppi di cifreAggiungere virgole (separatore di raggruppamento) al numero senza modificare i decimali?

EG:

1200.20 >> 1,200.20 
15000 >> 15,000 

Sto cercando di capire come farlo con DecimalFormat, a questo punto sono stato usando una mia sceneggiatura che sembra eccessivamente complicata. Non riesco a capire come farlo, usando # nasconde semplicemente zero finali e usando 0 li aggiunge al numero.

Questo è quello che sto cercando in questo momento:

DecimalFormat df = new DecimalFormat("###,###.####", new DecimalFormatSymbols(Locale.US)); 
resultStr = df.format(Double.valueOf(resultStr)); 

Sono sicuro che deve essere facile, ma io non sono sicuro di come farlo. Non devo farlo con DecimalFormat, ho solo pensato che sarebbe stato il modo più semplice. Come posso semplicemente aggiungere le virgole senza modificare i decimali in alcun modo?

risposta

14

È necessario utilizzare un oggetto NumberFormat e impostarlo per utilizzare il raggruppamento. Qualcosa di simile

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

public class NumberFormatEg { 
    public static void main(String[] args) { 
     NumberFormat myFormat = NumberFormat.getInstance(); 
     myFormat.setGroupingUsed(true); 

     double[] numbers = { 11220.00, 232323232.24, 121211.55, 102.121212 }; 

     for (double d : numbers) { 
     System.out.println(myFormat.format(d)); 
     } 
     System.out.println(); 

     DecimalFormat decimalFormat = new DecimalFormat("#.00"); 
     decimalFormat.setGroupingUsed(true); 
     decimalFormat.setGroupingSize(3); 

     for (double d : numbers) { 
     System.out.println(decimalFormat.format(d)); 
     } 

     System.out.println("\nFor Germany"); 

     NumberFormat anotherFormat = NumberFormat 
      .getNumberInstance(Locale.GERMAN); 
     if (anotherFormat instanceof DecimalFormat) { 
     DecimalFormat anotherDFormat = (DecimalFormat) anotherFormat; 
     anotherDFormat.applyPattern("#.00"); 
     anotherDFormat.setGroupingUsed(true); 
     anotherDFormat.setGroupingSize(3); 

     for (double d : numbers) { 
      System.out.println(anotherDFormat.format(d)); 
     } 

     } 

     System.out.println("\nFor US:"); 

     anotherFormat = NumberFormat.getNumberInstance(Locale.US); 
     if (anotherFormat instanceof DecimalFormat) { 
     DecimalFormat anotherDFormat = (DecimalFormat) anotherFormat; 
     anotherDFormat.applyPattern("#.00"); 
     anotherDFormat.setGroupingUsed(true); 
     anotherDFormat.setGroupingSize(3); 

     for (double d : numbers) { 
      System.out.println(anotherDFormat.format(d)); 
     } 

     } 
    } 
} 

che restituisce:

11,220 
232,323,232.24 
121,211.55 
102.121 

11,220.00 
232,323,232.24 
121,211.55 
102.12 

For Germany 
11.220,00 
232.323.232,24 
121.211,55 
102,12 

For US: 
11,220.00 
232,323,232.24 
121,211.55 
102.12 

Un vantaggio di questo è che la soluzione può essere specifico locale.

Edited
Ora mostra un esempio con un oggetto DecimalFormat. Si noti che è necessario impostare la dimensione del raggruppamento se si utilizza questo.

+0

Un 'DecimalFormat' *** è un *** NumberFormat' –

+0

@a_horse_with_no_name' : true, poteva chiamare 'setGroupingUsed (true)' sull'oggetto DecimalFormat. –

+0

Ho usato il codice anche se con decimalformat. Comunque usa '.' invece di virgole per gruppi. Come posso cambiarlo in "," o Locale.US? – lisovaccaro

10

Si può anche provare qualcosa di simile

DecimalFormat df = new DecimalFormat("#,###.00"); 

System.out.println(df.format(1200.20)); 
System.out.println(df.format(15000)); 
System.out.println(df.format(123456789.99)); 
 
1,200.20 
15,000.00 
123,456,789.99 
+0

È meglio chiamare 'setGroupingUsed (true)' e 'setGroupingSize (3)' altrimenti la soluzione non funzionerà con i numeri> 999999.00. –

+0

@HovercraftFullOfEels Sembra funzionare bene per tali numeri, ad es. '9999999,00' ->' 9,999,999.00'. – arshajii

+0

Ritraggo quello che ho detto. 1+ Questo è il mio ultimo voto rimasto per la giornata. :( –

1

non ho potuto fare qualsiasi le altre soluzioni funzionano, alcune arrotondano i decimali, altre aggiungono zero finali o altre rimuovono gli zero finali.

Non ho intenzione di accettare la mia risposta, ma posterò la mia sceneggiatura nel caso qualcuno la trovi utile.

public void(String str) { 
    int floatPos = str.indexOf(".") > -1 ? str.length() - str.indexOf(".") : 0; 
    int nGroups= (str.length()-floatPos-1-(str.indexOf("-")>-1?1:0))/3; 
    for(int i=0; i<nGroups; i++){ 
     int commaPos = str.length() - i * 4 - 3 - floatPos; 
    str = str.substring(0,commaPos) + "," + str.substring(commaPos,str.length()); 
    } 
    return str; 
} 


1    => 1 
1.0   => 1.0 
1234.01  => 1,234.01 
1100100.12345 => 1,100,100.12345 
0

Il più semplice soluzione

Perché non utilizzare il comma , flag con printf.

System.out.printf("%,d\n", 58625);// the d to accept decimal integer 
System.out.printf("%,.2f", 12345678.9);// the f to accept folouting point and 2 to take only 2 digits 

L'uscita sarà

58,625 
12,345,678.90 

E la buona notizia: Il separatore effettiva generata utilizzato is specific to the user’s locale

Problemi correlati