【问题标题】:<f:convertNumber/> does not recognize correct input for german currency<f:convertNumber/> 无法识别德国货币的正确输入
【发布时间】:2019-06-02 05:47:41
【问题描述】:

我正在我的 jsf Web 应用程序中设置货币输入字段,并有一个支持 bean 来写入值。但是,如果用户输入,转换器&lt;f:convertNumber/&gt; 似乎无法识别正确的输入。可以提交初始值并且可以更改数字,但输入一个值,例如 1,00 欧元 不会工作。我想保留格式化程序并了解如何解决此问题。

我将JSF 2.3.5-SP2 (Mojarra)Wildfly 14.0.1Java 10.0.1 一起使用

我将其缩小到数字和货币符号之间的空格,但我不知道如何让&lt;f:convertNumber/&gt; 将简单空格识别为正确输入。

经过一番检查后,原始空间被识别为非破坏空间&amp;nbsp;

这是我的测试代码:

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;
    }
}

当通过仅删除 0,00 € 的 0 并将其替换为 1 将数字更改为 1,00 € 时,我得到正确的输出。

当我用一个简单的空格替换数字和“€”符号之间的&amp;nbsp;(不间断)空格时,消息显示以下警告:

j_idt3:j_idt4: '0,00 €' konnte nicht als Währungswert interpretiert werden。
表示 '0,00 €' 不能解释为货币价值。

【问题讨论】:

  • 请始终发布版本和实施信息,因为它与您在答案中看到的相关。 “当我用一个简单的空格替换数字和'€'符号之间的空格时”不清楚。什么是简单空间,它是什么
  • 遗憾的是,在更换之前我不知道那里有什么样的空间。简单空间是您只需按空格键即可创建的空间。
  • 然后用浏览器开发工具检查有什么样的空白。
  • 我在上面的问题中添加了版本和实现信息。

标签: jsf currency number-formatting


【解决方案1】:

我尝试使用您的确切代码重现此问题,但无法重现。事实上,任何#,## € 输入似乎都可以正常工作。请注意 f:convertNumber 在底层使用 DecimalFormat - 因此不仅 JSF 版本之间可能会有细微的变化,Java 的不同版本之间也可能会有细微的变化。

我使用 JSF 2.3 和 Java 8 运行了您的代码,即使数字和欧元符号之间有空格,它也能很好地解析字符串。也许您正在触发已在更高版本中修复的本地化错误?

更新

在我的特定 Java 版本(Java 8、191-b12)、JSF 实现(2.3.3.99、Mojarra)和本地化规则上,这种行为似乎是完全相反。如果我在inputText 中传递&amp;nbsp;,转换器将拒绝解析它。也许这确实是本地化规则和组件行为之间的冲突。我不得不强制这个字符进入inputText 来触发它,因为浏览器默认会插入简单的空格。

解决问题

幸运的是,经过一些测试后,我发现您实际上可以通过提供 pattern 属性来解决该问题。在您的具体情况下,解决方案是做这样的事情,

<f:convertNumber pattern="#,##0.00 ¤" type="currency" locale="de_DE" currencyCode="EUR"/>

这将期望一个模式,其中欧元符号和数字之间的空格是一个简单的空格 (&amp;#32) 字符,而不是 &amp;nbsp;,由于某种原因,这似乎是您的环境中的默认行为。

【讨论】:

  • 至少在较旧的 java 版本中不支持空格 stackoverflow.com/questions/17471141/…
  • 有趣...是的,自定义转换器将是我的下一个建议 - 但对于上述想要的行为,似乎根本不需要。知道发生了什么变化以及何时以及究竟是什么导致了这种情况会很有趣。如果有人有一些信息 - 请分享。
  • 你的jsf实现和版本是什么?
  • 我可以确认它在 Oracle Java 8 (191-b12) 和 JSF 2.3.3.99 (Mojarra) 下工作
  • 嗯 2.3.3.99?那个奇怪的预言机需要非官方发布吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-01
相关资源
最近更新 更多