classcastException铸造Decimalformat.parse()的结果时,十进制为0时



我正在使用DecimalFormat处理来自不同地区的数字格式。我的DecimalFormat变量被声明如下:

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

此代码对我来说正常工作,除非数字的小数为0。例如,当值为" 2.1"时,它可以工作,而当它为" 2.0"时效率不在。那就是抛出以下例外的时候:

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

十进制为0时为什么不起作用?如何纠正这个?谢谢!

由于NumberFormat.parse()返回Number,因此可以返回任何具体的Number实现,例如IntegerFloat。将其投入到Double中,您可以假设它将返回Double,但是在许多情况下可能证明是错误的(正如您目睹的那样)。

如果您希望获得Double的结果,则应使用Number.doubleValue()这样的结果:

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

最新更新