如果number的长度大于> = 20位,fmt:formatNumber会抛出异常吗?

时间:2011-03-30 13:05:07

标签: java jsp jstl

我有一个货币字段,其长度大于> 20位数

例如:99999999999999999999

当我使用时:

<fmt:formatNumber
     value="${crudShipmentForm.invoiceVat}"
     pattern="###,###,###,###,##0.000"  />

我收到了NumberFormatException? 如何使用fmt:formatNumber将此字段格式化为货币?

4 个答案:

答案 0 :(得分:2)

您已超过long 9223372036854775807的最大值。

这表示您使用String来保留号码,而不是BigDecimalBigInteger。它不仅在技术上是错误的类型,而且EL也会将其强制转换为long。相应地修复它。

private BigDecimal invoiceVat; // And fix getter/setter as well.

或者如果由于某些奇怪的原因你真的无法更改类型,请在getter中进行

public BigDecimal getInvoiceVat() {
    return new BigDecimal(invoiceVat);
}

答案 1 :(得分:0)

对于大于NumberFormat的数字,您无法使用Long.MAX_VALUE。您应该使用DecimalFormat代替NumberFormat类。

答案 2 :(得分:0)

你的号码太大了。

以下是FormatNumberSupport的相关代码:

if (input instanceof String) {
    try {
    if (((String) input).indexOf('.') != -1) {
                // String value is interpreted as a double
        input = Double.valueOf((String) input);
    } else {
                // String value is interpreted as a long
        input = Long.valueOf((String) input);
    }
    } catch (NumberFormatException nfe) {
    throw new JspException(
                Resources.getMessage("FORMAT_NUMBER_PARSE_ERROR", input),
        nfe);
    }
}

您的电话号码超出了long

的范围

答案 3 :(得分:0)

我认为您要格式化数千的整数位数,在这种情况下使用pattern="###,##0.000"应该可以解决问题。