当十进制为 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()return是一个Number,它可以return任何具体的Number实现,例如IntegerFloat,例如。 将它转换为 Double 你假设它将 return Double,但在许多情况下它可能被证明是错误的(如你所见)。

如果您希望得到 Double 的结果,您应该这样选择 Number.doubleValue()

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