我正在jsf Web应用程序中为货币设置输入字段,并且有一个后备bean可以将值写入其中。但是,如果由用户输入,转换器<f:convertNumber/>
似乎无法识别正确的输入。可以提交初始值,可以更改数字,但输入的值应为
1,00€
将无法正常工作。我想保留格式化程序,并了解如何解决此问题。
我正在将
JSF 2.3.5-SP2 (Mojarra)
与Wildfly 14.0.1
和Java 10.0.1
一起使用
我将其范围缩小到数字和货币符号之间的空格,但我不知道如何使<f:convertNumber/>
识别一个简单的空格作为正确的输入。
稍作检查后,原始空间被确定为不间断空间
这是我的测试代码:
test.xhtml
<h:body>
<h:form>
<h:inputText value="#{testModel.number}">
<f:convertNumber type="currency" locale="de_DE" currencyCode="EUR"/>
</h:inputText>
<h:commandButton value="Submit" action="#{testModel.submit}"/>
<h:messages style = "color:red;margin:8px;" />
</h:form>
<h:outputText value="#{testModel.number}"/>
</h:body>
TestModel.java
@Named
@RequestScoped
public class TestModel {
private BigDecimal number;
public String submit(){
return "#";
}
public BigDecimal getNumber() {
if(number==null)number = new BigDecimal("0");
return number;
}
public void setNumber(BigDecimal number) {
this.number = number;
}
}
将数字更改为1.00€时,只需增加 0 中的 0 ,然后将其替换为1,我会得到正确的输出。
当我用简单的空格替换数字和“€”符号之间的
(不间断)空格时,消息显示以下警告:
答案 0 :(得分:1)
我尝试使用您的确切代码来重现此操作,但无法。实际上,任何#,## €
输入似乎都可以正常工作。请注意,f:convertNumber
在幕后使用DecimalFormat
-因此,不仅JSF版本之间可能会有细微变化,Java的不同版本之间也可能有细微变化。
我使用JSF 2.3和Java 8运行了您的代码,即使数字和欧元符号之间有空格,它也可以很好地解析字符串。也许您正在触发一个已在更高版本中修复的本地化错误?
在我的特定版本的Java( Java 8,191-b12 ),JSF实现( 2.3.3.99,Mojarra )和本地化规则中,行为似乎是完全相反。如果我在
中传递了inputText
,则转换器将拒绝对其进行解析。也许这确实是本地化规则与组件行为之间的冲突。由于浏览器默认会插入简单的空格,因此我不得不强制将此字符放入inputText
中以触发它。
幸运的是,经过一些测试,我发现您可以通过提供pattern
属性来解决此问题。在您的特定情况下,解决方案是执行类似的操作
<f:convertNumber pattern="#,##0.00 ¤" type="currency" locale="de_DE" currencyCode="EUR"/>
这将期望一个模式,其中欧元符号和数字之间的空格是简单空格( 
)字符,而不是
,这似乎是您环境中默认的行为出于某些原因。