代码之家  ›  专栏  ›  技术社区  ›  petehallw

转换DecimalFormat结果时的ClassCastException。小数为0时的parse()

  •  0
  • petehallw  · 技术社区  · 9 年前

    我正在使用 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”(意大利格式)。然后将该值存储为 Double 使用 DecimalFormat.parse() .

    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 回复  |  直到 9 年前
        1
  •  4
  •   Vladimir    9 年前

    自从 NumberFormat.parse() 返回 Number ,它可以返回任何混凝土 数字 实施,例如 Integer Float 例如 投给 Double 你假设它会回来 双重的 ,但在许多情况下,这可能会被证明是错误的(正如您所见证的)。

    如果您希望获得以下结果: 双重的 ,你应该去 Number.doubleValue() 像这样的:

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