我有一个货币字段,其长度大于> 20位数
例如:99999999999999999999
当我使用时:
<fmt:formatNumber
value="${crudShipmentForm.invoiceVat}"
pattern="###,###,###,###,##0.000" />
我收到了NumberFormatException
?
如何使用fmt:formatNumber
将此字段格式化为货币?
答案 0 :(得分:2)
您已超过long
9223372036854775807
的最大值。
这表示您使用String
来保留号码,而不是BigDecimal
或BigInteger
。它不仅在技术上是错误的类型,而且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"
应该可以解决问题。