0

Ich verwende DecimalFormat, um mit Zahlenformaten aus verschiedenen Gebietsschemas umzugehen. Meine DecimalFormat Variable deklariert wird, wie folgt:ClassCastException beim Umwandeln des Ergebnisses von DecimalFormat.parse(), wenn Dezimal 0 ist

NumberFormat m_nf; 
DecimalFormat m_df; 

if (strCountry.equals("IT") || strCountry.equals("ES")) 
    locale = java.util.Locale.ITALIAN; 
else 
    locale = java.util.Locale.ENGLISH; 

m_nf = NumberFormat.getInstance(locale); 

m_nf.setMaximumFractionDigits(1); 

m_df = (DecimalFormat) m_nf; 
m_df.applyPattern(".0"); 

ich dann einen Wert von meiner Methode getLowerLimit() zu erhalten und die Formatierung als String. Dies könnte entweder etwas wie "2.1" (im US-Format) oder "2.1" im italienischen Format sein. Der Wert wird dann als Double unter Verwendung von DecimalFormat.parse() gespeichert.

try { 
    String strValue = m_df.format(getLowerLimit()); 
    Double nValue = (Double) m_df.parse(strValue); 
} catch (ParseException | ClassCastException e) { 
    ErrorDialogGenerator.showErrorDialog(ExceptionConstants.LOWER_LIMIT, e); 
    System.exit(1); 
} 

Dieser Code arbeitet für mich OK, außer wenn die Dezimalstelle der Zahl ist 0. Zum Beispiel funktioniert es, wenn der Wert „2,1“ ist, aber nicht, wenn es „2.0“. Das ist, wenn es die folgende Ausnahme auslöst:

java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Double 

Warum funktioniert es nicht, wenn die Dezimalstelle eine 0 ist? Wie behebe ich das? Vielen Dank!

Antwort

4

Da NumberFormat.parse() ein Number zurückgibt, kann es keine konkrete Number Implementierung zurückkehren, wie Integer oder Float, zum Beispiel. Casting es zu Double Sie machen eine Annahme, dass es Double zurückgeben wird, aber es könnte sich in vielen Fällen als falsch erweisen (wie Sie gesehen haben).

Wenn Sie als Double erhalten führen, sollten Sie mit Number.doubleValue() als solche gehen:

Double nValue = m_df.parse(strValue).doubleValue(); 
+0

Dank, das war alles, was man braucht! – petehallw

Verwandte Themen