2

我有一个具有表单的 vaadin 应用程序,并且我使用 beanitem 作为数据源。在 beanitem 内部,我有一个浮点值,默认为 0.0。如果我输入像 123123123 这样的高值并提交(它保存到数据库),当我尝试在表单中编辑该字段时,我得到 1.23123123E9 作为值,为什么?当我编辑时,我仍然传递带有数据的beanitem,为什么它不能在文本字段中正确显示我的值?

我知道我是否必须显示我可以使用十进制格式的值,但这是在表单内,并且 vaadin 知道它是一个浮点数,所以它应该相应地处理它吗?或者我必须自己在表单域工厂中对其进行格式化吗?

PS:如何为表单内的值设置显示模式?我读过你可以实现bean内部字段的get并让它也返回一个字符串,这是正确的方法吗?

4

2 回答 2

6

实际上 Vaadin 的行为是正确的,但它遵循幅度规则(Yogendra Singh 已经提到过)请看一个例​​子

在此处输入图像描述

还请检查以下内容:

    float value1 = 12.0f;
    float value2 = 123123123;

    BeanItem<Float> item1 = new BeanItem<Float>(value1);
    BeanItem<Float> item2 = new BeanItem<Float>(value2);

    System.out.println(" result 1: " + item1.getBean());
    System.out.println(" result 2: " + item2.getBean());

结果:

result 1: 12.0
result 2: 1.2312312E8

所以正确的解决方案(如我所见)如下所示:

  1. 定义你自己的 Bean。没有理由让 BeanItem 包装浮点值。
  2. 定义您的 PropertyFormatter(示例
  3. 需要注意的重要一点是,不应返回 String 而不是正确的数据类型。它将影响编辑、验证等。

PropertyFormatter 示例:

/** Integer formatter that accepts empty values. */
public class LenientIntegerFormatter extends PropertyFormatter {

    public LenientIntegerFormatter(Property propertyDataSource) {
        setPropertyDataSource(propertyDataSource);
    }

    @Override
    public Object parse(String formattedValue) throws Exception {
        if ("".equals(formattedValue))
            return null;
        else
        return Integer.valueOf(formattedValue);
    }

    @Override
    public String format(Object value) {
        if (value == null)
            return "";

        return ((Integer) value).toString();
    }

    @Override
    public Class<?> getType() {
        return String.class;
    }
}

它可能看起来有点吓人,但这是灵活性的代价。自定义 Bean 允许使用表格视图、表单等,而无需任何重大更改。基本上,这是 Vaadin UI 背后的数据模型。

在此处输入图像描述

第 9 章将组件绑定到数据

自定义 Bean 示例:

public class Bean implements Serializable {
    String name;
    float value;

    public Bean(String name, float newValue) {
        this.name   = name;
        this.value = newValue;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public float getValue() {
        return value;
    }

    public void setValue(float newValue) {
        this.value = newValue;
    }
}

只是为了提供所有必需的见解:

 Bean bean = new Bean("Test", value1);
    BeanItem<Bean> beanItem = new BeanItem<Bean>(bean);
    for(Object propertyId: beanItem.getItemPropertyIds()) {
        System.out.println(" Property: '" + propertyId + 
                           "' value: " + beanItem.getItemProperty(propertyId));
    }

将打印:

Property: 'name' value: Test
Property: 'value' value: 12.0
于 2012-11-12T12:36:22.537 回答
1

toString()内部调用toString(float)这就是文档所说的toString(float)

否则,结果是一个字符串,表示参数的符号和大小(绝对值)。如果符号为负,则结果的第一个字符为'-'('\u002D');如果符号为正,则结果中不会出现符号字符。至于大小 m:

  • 如果 m 大于或等于 10-3 但小于 107,则表示为 m 的整数部分,以十进制形式表示,不带前导零,后跟“.”。('\u002E'),后跟一个或多个小数位,表示 m 的小数部分。

  • 如果 m 小于 10-3 或大于或等于 107,** 令 n 为唯一整数,使得 10n ≤ m < 10n+1;然后让 a 是 m 和 10n 的数学精确商,使得 1 ≤ a < 10。然后将大小表示为 a 的整数部分,作为一个十进制数字,后跟“。” ('\u002E'),后跟表示 a 小数部分的十进制数字,然后是字母 'E' ('\u0045'),然后是 n 表示为十进制整数,由 Integer 方法生成。到字符串(整数)。

要创建浮点值的本地化字符串表示,请使用 NumberFormat 的子类。

希望这可以帮助您理解WHYHOW修复它,即使用DecimalFormat您在现场工厂中提到的并作为字符串表示形式返回以用于显示目的。

于 2012-11-07T16:51:19.593 回答