如果我注释这样的命令对象字段,带逗号和点的小数将被验证并正确绑定(我想要):
@NumberFormat(style=Style.NUMBER)
private Double amount;
但是,使用@NumberFormat
以相同方式注释集合不起作用,因此我尝试在全局InitBinder
中重现此行为:
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.addCustomFormatter(new NumberStyleFormatter());
}
但它仍然只接受逗号。
Spring的注释处理器代码似乎也是这样,但它们同时接受逗号和点。我错过了什么?
public class NumberFormatAnnotationFormatterFactory extends EmbeddedValueResolutionSupport
implements AnnotationFormatterFactory<NumberFormat> {
@Override
public Set<Class<?>> getFieldTypes() {
return NumberUtils.STANDARD_NUMBER_TYPES;
}
@Override
public Printer<Number> getPrinter(NumberFormat annotation, Class<?> fieldType) {
return configureFormatterFrom(annotation);
}
@Override
public Parser<Number> getParser(NumberFormat annotation, Class<?> fieldType) {
return configureFormatterFrom(annotation);
}
private Formatter<Number> configureFormatterFrom(NumberFormat annotation) {
if (StringUtils.hasLength(annotation.pattern())) {
return new NumberStyleFormatter(resolveEmbeddedValue(annotation.pattern()));
}
else {
Style style = annotation.style();
if (style == Style.CURRENCY) {
return new CurrencyStyleFormatter();
}
else if (style == Style.PERCENT) {
return new PercentStyleFormatter();
}
else {
return new NumberStyleFormatter(); // THIS CASE
}
}
}
}
答案 0 :(得分:0)
使用模式。
NumberStyleFormatter提供setPattern
方法,您可以设置模式(正则表达式)。
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.addCustomFormatter(new NumberStyleFormatter(String pattern));
}
更新:正则表达式接受逗号和点^[0-9.,]+$
。
System.out.println("50,000.25".matches("^[0-9.,]+$")); //true