繁体   English   中英

当十进制为0时转换DecimalFormat.parse()的结果时,ClassCastException

[英]ClassCastException when casting result of DecimalFormat.parse() when decimal is 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();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM