vaadin 8网格,具有基于Locale的Double数据类型的列



我正在尝试填充Vaadin 8网格,其中一列的类型为double。我正在通过将数据与一个bean组合,将其加载到表中。我是按照以下方式做的,

任务bean:

public class Tasks{
private int id;
private Double duration;
public StakeholderTasks(int i, String string) {
this.id = id;
this.taskName=taskName;
// TODO Auto-generated constructor stub
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Double getDuration() {
return duration;
}
public void setDuration(Double duration) {
this.duration = duration;
}
}

任务Impl:

public class stakeholderImpl extends CustomComponent {
private Grid < Tasks > grid1;
private Binder < Tasks > binder = new Binder < > (Tasks.class);
cmpy = datastoreinstance.updateTaskList();
provider1 = new ListDataProvider < > (cmpy);
grid1 = new Grid < > ();
grid1.addColumn(Tasks::getDuration);
grid1.asSingleSelect().addValueChangeListener(event -> {
form.setVisible(false);
window = createWindow(window,
((MainUI)(UI.getCurrent())).getLanguageMessage("general.addnewtask"),
event.getValue(), "EDIT", form);
}
catch (ClassNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
});
binder.forField(duration).asRequired(((MainUI)(UI.getCurrent())).getLanguageMessage("general.required"))
.withValidator(new RegexpValidator(((MainUI)(UI.getCurrent())).getLanguageMessage("general.numerror"), DBConstants.regex))
.bind(taskdetails -> nf_out.format(stakeholders.getDuration()),
(taskdetails, formValue) -> 
{
NumberFormat nf_in = NumberFormat.getNumberInstance(Locale.GERMANY);
double val = 0 d;
try {
val = nf_in.parse(formValue).doubleValue();
taskdetails.setDuration(val);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
});
}

当我单击网格中的一行,然后从该行获取值,加载表单,然后在保存后在网格中显示值。我在活页夹中所做的持续时间是基于LOCALE.GERMANY验证double的值,否则使用regex(regex= "[0-9]+([.,][0-9]{1,2})?";)验证

我面临的问题是:

  • 我得到的是.而不是,,用于网格中的十进制符号(在数据库中它有,(
  • 单击网格时,"持续时间"列会使零的数量加倍。例如:如果单击网格中的值为10.0,则该值将更改为10000.00或1000.00。有没有一种方法可以基于德国的Locale加载网格?

  • 我知道我没有正确处理这件事。有更好的方法吗?有人能帮我渡过难关吗。我现在正在学习Vaadin,我无法使它正常工作。

一种替代且简单的方法是,您可以使用框架的StringToDoubleConverter。默认情况下,它使用NumberFormat.getNumberInstance(区域设置(作为数字格式。如果您想要本地默认数字格式以外的其他格式,可以扩展StringToDoubleConverter并重写getFormat方法以返回自定义的NumberFormat。