当十进制为 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
实现,例如Integer
或Float
。
将其转换为 Double
您会假设它将返回 Double
,但在许多情况下它可能会被证明是错误的(正如您所见证的那样)。
如果您希望得到Double
的结果,您应该使用Number.doubleValue()
:
Double nValue = m_df.parse(strValue).doubleValue();
【讨论】:
谢谢,这就是我们所需要的!以上是关于当十进制为 0 时,DecimalFormat.parse() 的转换结果时发生 ClassCastException的主要内容,如果未能解决你的问题,请参考以下文章