XHTML中convertNumber标签locale属性在Tomcat中失效求助
问题描述
使用PrimeFaces构建UI,表格内有一列美元货币数据,预期负数金额显示为($数值)格式(例如-0.85显示为($0.85))。通过<f:convertNumber>的locale="en-US"配置,在JBoss环境中正常生效,但迁移到Tomcat后,负数显示为-$0.87,不符合预期。相关代码如下:
<p:column exportable="true"> <f:facet name="header"> <h:outputLabel value="Difference" /> </f:facet> <h:outputText value="#{CurrencyVar.Amt}" style="float:right;"> <f:convertNumber type="currency" locale="en-US" maxFractionDigits="2" /> </h:outputText> </p:column>
解决方法
显式指定货币格式模式:Tomcat默认Locale数据可能未完全遵循en-US的负数货币格式,直接在
<f:convertNumber>中添加pattern属性强制定义格式:<f:convertNumber type="currency" locale="en-US" maxFractionDigits="2" pattern="¤#,##0.00;(¤#,##0.00)" />其中
(¤#,##0.00)部分定义负数显示规则,¤会自动替换为对应Locale的货币符号(en-US下为$)。修正Tomcat的JVM Locale配置:确保Tomcat的JVM启动参数设置了正确的US Locale,在
catalina.sh(Linux/Mac)或catalina.bat(Windows)中添加:# Linux/Mac JAVA_OPTS="$JAVA_OPTS -Duser.language=en -Duser.region=US" # Windows set JAVA_OPTS=%JAVA_OPTS% -Duser.language=en -Duser.region=US重启Tomcat后生效,保证JVM层面Locale与页面配置一致。
自定义PrimeFaces货币转换器:若上述方法无效,可自定义转换器手动处理负数格式:
@FacesConverter("customCurrencyConverter") public class CustomCurrencyConverter extends CurrencyConverter { @Override public String getAsString(FacesContext context, UIComponent component, Object value) { String original = super.getAsString(context, component, value); if (value instanceof Number && ((Number) value).doubleValue() < 0) { return original.replace("-$", "($").concat(")"); } return original; } }页面中使用该自定义转换器:
<h:outputText value="#{CurrencyVar.Amt}" style="float:right;"> <f:converter converterId="customCurrencyConverter" /> <f:attribute name="locale" value="en-US" /> <f:attribute name="maxFractionDigits" value="2" /> </h:outputText>
内容的提问来源于stack exchange,提问作者Deepu
相关产品推荐
相关产品推荐

