当前位置: 代码迷 >> java >> 如果number的长度> = 20位,fmt:formatNumber会抛出异常吗?
  详细解决方案

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

热度:102   发布时间:2023-07-25 19:09:03.0

我有一个长度> 20位的货币字段

例如:99999999999999999999

当我用的时候:

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

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

您已经超过了long的最大值9223372036854775807

这表明您使用String来保存数字而不是BigDecimalBigInteger 它不仅在技术上是错误的类型,而且EL也会long强迫它。 相应地修复它。

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

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

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

您不能将NumberFormat用于大于Long.MAX_VALUE数字。 您应该使用而不是NumberFormat类。

你的号码太大了。

这是的相关代码:

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的范围

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

  相关解决方案