Spring MVC @NumberFormat (pattern = "#. ###, ##") Неправильный шаблон - PullRequest
0 голосов
/ 26 июня 2019

Я использую Spring MVC (4.3.3.RELEASE).В моем классе Entity есть поле BigDecimal, которое я хотел бы отобразить в весенней форме: форма

<form:input path="number" />

как 1.000.000,11

Я пытался @NumberFormat (pattern = "#. ###, ## ") в поле, но у меня есть исключение:

org.springframework.core.convert.ConversionFailedException: Не удалось преобразовать из типа @ javax.validation.constraints.NotNull @ org.springframework.format.annotation.NumberFormat java.math.BigDecimal для ввода java.lang.String для значения '100000000000.22';вложенное исключение - java.lang.IllegalArgumentException: искаженный шаблон "#. ###, ##"

при попытке просмотра формы.

Мой класс сущности:

@Entity
@Table(name="test")
public class Test {
private BigDecimal number;
...

@NumberFormat(pattern =  "#.###,##")
@Column(name="number")
public BigDecimal getNumber() {
    return number;
}
public void setNumber(BigDecimal number) {
    this.number = number;
}
...
}

Есть ли способ для просмотра в форме этого шаблона = "#. ###, ##"?

Ответы [ 2 ]

0 голосов
/ 05 июля 2019

Я решил с помощью:

public class BigDecimalEditor extends PropertyEditorSupport {

private static Logger logger = Logger.getLogger(BigDecimalEditor.class);

@Override
public String getAsText() {
    String s = null;
    if (getValue() != null) {
        BigDecimal bd = (BigDecimal) getValue();
        DecimalFormat df = (DecimalFormat) NumberFormat.getInstance(Locale.GERMAN);
        df.setParseBigDecimal(true);
        s = df.format(bd);
    }
    return s;
}

@Override
public void setAsText(String text) throws IllegalArgumentException {
    DecimalFormat df = (DecimalFormat) NumberFormat.getInstance(Locale.GERMAN);
    df.setParseBigDecimal(true);
    BigDecimal bd = null;
    try {
        bd = (BigDecimal) df.parseObject(text);
    } catch (ParseException e) {
        logger.error("setAsText error", e);
        setValue(null);
    }
    setValue(bd);
}

}

и в классе @Controller

@InitBinder
public void initBinder(WebDataBinder binder) {
    binder.registerCustomEditor(BigDecimal.class, new BigDecimalEditor());
}
0 голосов
/ 26 июня 2019

Я считаю, что @NumberFormat поддерживает только английскую локаль. Этот пост имеет хороший ответ для альтернативы Использовать другую локаль для @NumberFormat весной

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...