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

Posted

技术标签:

【中文标题】当十进制为 0 时,DecimalFormat.parse() 的转换结果时发生 ClassCastException【英文标题】:ClassCastException when casting result of DecimalFormat.parse() when decimal is 0 【发布时间】:2016-12-19 12:39:26 【问题描述】:

我使用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时不起作用?我该如何纠正这个问题?谢谢!

【问题讨论】:

【参考方案1】:

由于NumberFormat.parse()返回Number,它可以返回任何具体的Number实现,例如IntegerFloat。 将其转换为 Double 您会假设它将返回 Double,但在许多情况下它可能会被证明是错误的(正如您所见证的那样)。

如果您希望得到Double 的结果,您应该使用Number.doubleValue()

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

【讨论】:

谢谢,这就是我们所需要的!

以上是关于当十进制为 0 时,DecimalFormat.parse() 的转换结果时发生 ClassCastException的主要内容,如果未能解决你的问题,请参考以下文章

BowWow and the Timetable CodeForces - 1204A 思维

Java-位运算

数论模板

怎么把float型转换成int

手撕代码:判断二进制串除以3的余数

CSAPP —— 信息的表示和处理