jsf numbeformat with dynamic currencySymbol

时间:2014-08-21 10:23:29

标签: jsf-2 number-formatting

嗨,在我的项目中,我需要可视化货币价值,就像我的f:convertNumber

一样

我使用固定货币符号;一切都很好,但是当我尝试使用这样的表达式语言来获取符号时:

<h:outputText value="#{rowItem.value}">
    <f:convertNumber currencySymbol="#{rowItem.getCurrencySymbol()}" groupingUsed="true" maxFractionDigits="2" type="currency" />
</h:outputText>

就像没有调用getCurrencySymbol方法一样,我确信有些东西我不知道。

1 个答案:

答案 0 :(得分:4)

如果#{rowItem}仅在视图渲染时间内可用,例如由<h:dataTable var="rowItem">指定,则会发生这种情况,因为变量名称本身已经建议。 <f:convertNumber>是标记处理程序,而不是UI组件。它在视图构建时执行,而不是在视图渲染时执行。在视图构建期间#{rowItem}不可用。

这一切都在JSTL in JSF2 Facelets... makes sense?中解释。在该答案中,您可以替换&#34; JSTL&#34;使用<f:convertNumber>,因为它们都是标记处理程序,因此具有完全相同的生命周期。

在没有创建自定义转换器并更改视图或模型的情况下,标准JSF API中没有解决方案。您可以在此答案中找到可能的解决方案:How to set converter properties for each row of a datatable?

JSF实用程序库OmniFaces提供了<o:converter>框,以解决此问题。使用方法如下:

<h:outputText value="#{rowItem.value}">
    <o:converter converterId="javax.faces.Number" currencySymbol="#{rowItem.getCurrencySymbol()}" type="currency" />
</h:outputText>

(请注意,我省略了其他两个属性,因为这些属性在使用type="currency"时已经是默认属性)