【问题标题】:Spring MVC @NumberFormat(pattern = "#.###,##") Malformed patternSpring MVC @NumberFormat(pattern = "#.###,##") 格式错误的模式
【发布时间】:2019-06-26 09:50:29
【问题描述】:

我正在使用 Spring MVC (4.3.3.RELEASE)。我的 Entity 类有一个 BigDecimal 字段,我想以 spring 形式显示:form

<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: Malformed pattern "#.###,##"

当我尝试查看表单时。

我的实体类是:

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

有没有办法以这种模式查看=“#.###,##”?

【问题讨论】:

标签: java spring forms spring-mvc


【解决方案1】:

我相信@NumberFormat 只支持英语语言环境。这篇文章有一个很好的答案替代Use Different Locale for @NumberFormat in Spring

【讨论】:

    【解决方案2】:

    我解决了:

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

    【讨论】:

      猜你喜欢
      • 2011-05-20
      • 2017-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多