<f: convertNumber /> не распознает правильный ввод для немецкой валюты - PullRequest
0 голосов
/ 07 января 2019

Я настраиваю поле ввода для валюты в своем веб-приложении jsf, и у меня есть компонент поддержки, в который записывается значение. Однако преобразователь <f:convertNumber/>, похоже, не распознает правильный ввод, если он введен пользователем. Исходное значение может быть отправлено, а числа могут быть изменены, но введите значение, подобное 1,00 € не сработает Я хотел бы сохранить средство форматирования, а также понять, как решить эту проблему.

Я использую JSF 2.3.5-SP2 (Mojarra) с Wildfly 14.0.1 и Java 10.0.1

Я сузил его до промежутка между числом и символом валюты, но я не знаю, как заставить <f:convertNumber/> распознать простой пробел в качестве правильного ввода.

После небольшой проверки исходное пространство было идентифицировано как неразрывное пространство &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;
    }
}

Если изменить число на 1,00 €, просто уменьшив 0 из 0 , 00 € и заменив его на 1, я получу правильный вывод.
image of correct output

Когда я заменяю пробел &nbsp; (неразрывный) между числом и символом '€ на простой пробел, сообщение показывает следующее предупреждение:

j_idt3: j_idt4: '0,00 €' konnte nicht als Währungswert интерпретатор werden.
значение '0,00 €' не может быть интерпретировано как значение валюты.
image of wrong recognition

1 Ответ

0 голосов
/ 07 января 2019

Я попытался воспроизвести это, используя ваш точный код, но не смог. На самом деле, любой #,## € ввод работает нормально. Обратите внимание, что f:convertNumber использует DecimalFormat под капотом - поэтому могут быть небольшие изменения не только между версиями JSF, но и, возможно, также между различными версиями Java.

Я запустил ваш код с JSF 2.3 и Java 8, и он отлично разбирает строку даже с пробелом между числом и знаком евро. Может быть, вы вызываете ошибку локализации, которая была исправлена ​​в более поздней версии?

Обновление

Кажется, что в моей конкретной версии Java ( Java 8, 191-b12 ), реализации JSF ( 2.3.3.99, Mojarra ) и правил локализации поведение совершенно противоположное , Если я передам &nbsp; в inputText, конвертер откажется его анализировать. Возможно, это действительно противоречие между правилами локализации и поведением компонента. Мне пришлось заставить этот символ в inputText вызвать его, хотя браузер по умолчанию будет вставлять простые пробелы.

Обход проблемы

К счастью, после некоторого тестирования я обнаружил, что вы можете обойти эту проблему, предоставив атрибут pattern. В вашем конкретном случае решением будет сделать что-то вроде этого,

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

Это будет ожидать паттерн, в котором пробел между знаком евро и числом представляет собой простой символ пробела (&#32) вместо &nbsp;, который по некоторым причинам кажется поведением по умолчанию в вашей среде.

...