0

我使用 DataBinder 将值映射到这样的对象:

final var binder = new DataBinder(target);
binder.setIgnoreUnknownFields(false);
binder.bind(new MutablePropertyValues(properties));

现在我有一些以逗号作为小数分隔符的字符串,需要转换为双精度。

这给了我以下错误,因为“0,00” 无法转换为双精度:

Field error in object 'target' on field 'price': rejected value [0,00];
codes [typeMismatch.target.price,typeMismatch.price,typeMismatch.double,typeMismatch];
arguments [org.springframework.context.support.DefaultMessageSourceResolvable:
codes [target.price,price]; arguments []; default message [price]]; default message
[Failed to convert property value of type 'java.lang.String' to required type 'double'
for property 'price'; nested exception is java.lang.NumberFormatException: For input string: "0,00"]

我不知道如何使 DataBinder 接受逗号作为小数分隔符或使用语言环境Locale.FR(这是数据源语言环境)。

这没有帮助:

LocaleContextHolder.setLocale(Locale.FRANCE);
Locale.setDefault(Locale.FRANCE);

有人可以告诉我如何处理小数点逗号吗?

这是我的测试用例:

class DataBinderTest {

    class Foo {
        public double price;
        public void setPrice(double price) {
            this.price=price;
        }
    }

    @Test
    void testMapping() throws BindException {
        final var properties = new Properties();
        properties.setProperty("price","0,00");

        final var binder = new DataBinder(new Foo());
        binder.setIgnoreUnknownFields(false);
        binder.bind(new MutablePropertyValues(properties));
        if (binder.getBindingResult().hasErrors()) {
            throw new BindException(binder.getBindingResult());
        }
    }
}
4

1 回答 1

0

解决方案是注册一个自定义编辑器,如下所示:

binder.registerCustomEditor(Double.class,
    new CustomNumberEditor(Double.class, NumberFormat.getInstance(Locale.FRANCE), true));

其中布尔参数告诉是否应接受空字符串并将其转换为null. (注意:true当然这不适用于原始类型double

于 2021-09-14T12:26:27.037 回答