2009-07-08 15 views

risposta

46

Dai un'occhiata allo java.text.NumberFormat. Per esempio:

import java.text.*; 
import java.util.*; 

public class Test 
{ 
    // Just for the sake of a simple test program! 
    public static void main(String[] args) throws Exception 
    { 
     NumberFormat format = NumberFormat.getInstance(Locale.US); 

     Number number = format.parse("835,111.2"); 
     System.out.println(number); // or use number.doubleValue() 
    } 
} 

A seconda del tipo di quantità che si sta utilizzando, però, si potrebbe desiderare di analizzare ad un BigDecimal invece. Il modo più semplice di farlo è probabilmente:

BigDecimal value = new BigDecimal(str.replace(",", "")); 

o utilizzare un DecimalFormat con setParseBigDecimal(true):

DecimalFormat format = (DecimalFormat) NumberFormat.getInstance(Locale.US); 
format.setParseBigDecimal(true); 
BigDecimal number = (BigDecimal) format.parse("835,111.2"); 
+0

Sei sicuro 'NumberFormat.getInstance' restituirà sempre istanza di' DecimalFormat'. E la sostituzione manuale delle virgole con punti non sostituisce l'intera idea di localizzazione? –

+0

@Tadeusz: la domanda riguarda specificamente "numeri con virgole" - non "numeri nella locale corrente". Quando la domanda è specifica, è logico che la risposta sia specifica. Per quanto riguarda NumberFormat.getInstance potenzialmente non si restituisce DecimalFormat - sì, questa è una possibilità. Non sono sicuro che sia il modo migliore, per essere onesti; l'API non è particolarmente utile lì :( –

+0

buona, molto utile –

5

Uso java.text.DecimalFormat:

DecimalFormat è una sottoclasse concreta di NumberFormat che formatta i numeri decimali . Ha una varietà di funzioni progettate per rendere possibile l'analisi di e il formato dei numeri in qualsiasi locale, incluso il supporto per Western, arabo, e cifre di Indic. Supporta anche diversi tipi di numeri, inclusi numeri interi (123), numeri a virgola fissa (123.4), notazione scientifica (1.23E4), percentuali (12%) e valuta importi ($ 123). Tutti questi possono essere localizzati .

10

Il più semplice non è sempre il più corretto. Ecco il modo più semplice:

String s = "835,111.2"; 
// NumberFormatException possible. 
Double d = Double.parseDouble(s.replaceAll(",","")); 

Non ho disturbato con locali in quanto lei ha dichiarato espressamente che volevi virgole sostituiti in modo da sto supponendo che hai già te stesso affermato come un locale con virgola è il separatore delle migliaia e il periodo è il separatore decimale. Ci sono risposte migliori qui se vuoi il comportamento corretto (in termini di internazionalizzazione).

2

A link can say more than thousand words

// Format for CANADA locale 
Locale locale = Locale.CANADA; 
String string = NumberFormat.getNumberInstance(locale).format(-1234.56); // -1,234.56 

// Format for GERMAN locale 
locale = Locale.GERMAN; 
string = NumberFormat.getNumberInstance(locale).format(-1234.56); // -1.234,56 

// Format for the default locale 
string = NumberFormat.getNumberInstance().format(-1234.56); 


// Parse a GERMAN number 
try { 
    Number number = NumberFormat.getNumberInstance(locale.GERMAN).parse("-1.234,56"); 
    if (number instanceof Long) { 
     // Long value 
    } else { 
     // Double value 
    } 
} catch (ParseException e) { 
} 
+3

un collegamento morto non può –

+0

Buon punto, utilizzato il [sistema di ritorno] (http://web.archive.org/web/20110702052222/http: //exampledepot.com/egs/java.text/Numbers.html) e copiato l'esempio –

1
There is small method to convert german price format 
    public static BigDecimal getBigDecimalDe(String preis) throws ParseException { 
     NumberFormat nf = NumberFormat.getInstance(Locale.GERMAN); 
     Number number = nf.parse(preis); 
     return new BigDecimal(number.doubleValue()); 
    } 
    ---------------------------------------------------------------------------- 
    German format BigDecimal Preis into decimal format 
    ---------------------------------------------------------------------------- 
    public static String decimalFormat(BigDecimal Preis){  
     String res = "0.00"; 
        if (Preis != null){     
         NumberFormat nf = NumberFormat.getInstance(Locale.GERMANY); 
         if (nf instanceof DecimalFormat) {      
          ((DecimalFormat) nf).applyPattern("###0.00"); 

          } 
          res = nf.format(Preis);         
        } 
      return res; 

     } 
--------------------------------------------------------------------------------------- 
/** 
* This method converts Deutsche number format into Decimal format. 
* @param Preis-String parameter. 
* @return 
*/ 
public static BigDecimal bigDecimalFormat(String Preis){   
    //MathContext mi = new MathContext(2); 
    BigDecimal bd = new BigDecimal(0.00); 
       if (!Util.isEmpty(Preis)){ 
        try { 
//      getInstance() obtains local language format 
        NumberFormat nf = NumberFormat.getInstance(Locale.GERMAN); 
        nf.setMinimumFractionDigits(2); 
        nf.setMinimumIntegerDigits(1); 
        nf.setGroupingUsed(true); 


        java.lang.Number num = nf.parse(Preis); 
        double d = num.doubleValue(); 
         bd = new BigDecimal(d); 
        } catch (ParseException e) {       
         e.printStackTrace(); 
        }      
       }else{ 
        bd = new BigDecimal(0.00); 
       } 

       //Rounding digits 
     return bd.setScale(2, RoundingMode.HALF_UP); 

    } 
Problemi correlati