0

異なるロケールの数値書式を処理するのにDecimalFormatを使用しています。次のように私のDecimalFormat変数が宣言されています:10進数が0のときにDecimalFormat.parse()の結果をキャストするときのClassCastException

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"); 

私はその後、私の方法getLowerLimit()から値を取得し、それを文字列として書式設定しています。これは、 "2.1"(米国形式)または "2,1"(イタリア語形式)のいずれかである可能性があります。値はDecimalFormat.parse()を使用してDoubleとして格納されます。

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); 
} 

このコードは、数の小数は、それが「2.0」であるとき、それは値が「2.1」であるときに動作しなく例えば0であるときを除いて私のために[OK]を働いています。つまり、次の例外がスローされます。

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

10進数が0のときはどうして機能しませんか?これをどうやって修正するのですか?ありがとう!

答えて

4

NumberFormat.parse()Numberを返すので、それは、例えば、Integer又はFloatように、任意の具体的Number実装を返すことができます。 にキャストすると、Doubleが返されることを前提にしていますが、多くの場合(目撃したように)間違っている可能性があります。あなたはDoubleとして結果を取得したい場合は

、次のようなNumber.doubleValue()で行く必要があります。

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

おかげで、それが必要だったものをすべてでした! – petehallw

関連する問題