Qual è il modo più semplice e corretto per convertire un numero stringa con virgole (ad esempio: 835,111.2) in un'istanza Doppia.Convertire una stringa in Double - Java
Grazie.
Qual è il modo più semplice e corretto per convertire un numero stringa con virgole (ad esempio: 835,111.2) in un'istanza Doppia.Convertire una stringa in Double - Java
Grazie.
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");
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 .
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).
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) {
}
un collegamento morto non può –
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 –
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);
}
Sei sicuro 'NumberFormat.getInstance' restituirà sempre istanza di' DecimalFormat'. E la sostituzione manuale delle virgole con punti non sostituisce l'intera idea di localizzazione? –
@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ì :( –
buona, molto utile –