问题描述
我有一个长度> 20位的货币字段
例如:99999999999999999999
当我用的时候:
<fmt:formatNumber
value="${crudShipmentForm.invoiceVat}"
pattern="###,###,###,###,##0.000" />
我收到了NumberFormatException
?
如何使用fmt:formatNumber
将此字段格式化为货币?
1楼
您已经超过了long
的最大值9223372036854775807
。
这表明您使用String
来保存数字而不是BigDecimal
或BigInteger
。
它不仅在技术上是错误的类型,而且EL也会long
强迫它。
相应地修复它。
private BigDecimal invoiceVat; // And fix getter/setter as well.
或者如果由于某些奇怪的原因你真的无法改变类型,那么在getter中进行
public BigDecimal getInvoiceVat() {
return new BigDecimal(invoiceVat);
}
2楼
您不能将NumberFormat
用于大于Long.MAX_VALUE
数字。
您应该使用而不是NumberFormat
类。
3楼
你的号码太大了。
这是的相关代码:
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
的范围
4楼
我假设您要格式化数千的整数位,在这种情况下使用pattern="###,##0.000"
应该可以解决问题。