我有一个GWT项目,其语言环境设置为fr。我有一个自定义文本字段,使用数字格式来验证和格式化数字输入。
格式化工作正常但不是输入验证。以下是验证新值是否为有效百分比的方法的快照(这称为onValueChanged):
private void validateNumber(String newVal){
logger.debug("value changed, newVal="+newVal+", current="+current);
// Attempt to parse value
double val=0;
try{
val=Double.parseDouble(newVal);
}catch(NumberFormatException e){
logger.warn("parsing failed",e);
try{
val=getFormatter().parse(newVal);
}catch(NumberFormatException ex){
logger.warn("parsing with nb format failed",ex);
// on failure: restore previous value
setValue(current,false);
return;
}
}
//some check on min and max value here
}
例如,如果程序将起始值设置为“0.2”,则它将显示为20,00%,因此使用正确的小数分隔符。 现在:
你知道如何修改方法让0,1和10%被识别为有效输入吗?
答案 0 :(得分:0)
正如Colin所提到的,你肯定想要使用GWT数字格式对象而不是Double来解析和格式化,因此解析和格式化是特定于区域设置的。
下面是我可以找到的一些代码片段,用于解析,验证和格式化百分比数字。
但请注意,编辑过程的文本框值为%单位硬编码 ,因此在编辑过程中没有20,45%和0.2045之间的转换,直接输入20,45并且可视化。我模糊地回忆起在编辑过程中为这种转换而苦苦挣扎,但忘了细节,因为它已经有一段时间了。因此,如果它是您的问题和要求的关键部分,那么我担心下面的示例可能价值有限。无论如何,他们在这里!
符号:
TextBox txt = new TextBox();
NumberFormat _formatFloat = NumberFormat.getFormat("#,##0.00");
NumberFormat _formatPercent = NumberFormat.getFormat("##0.00%");
解析文本条目如“20,45”为20.45(不是“20,45%”为0.2045):
txt.setText("20,45"); // French locale format example, % symbol hard-coded outside of text box.
try {
float amount = (float) _formatFloat.parse(txt.getText());
} catch (NumberFormatException e) ...
解析&验证文本条目,如“20,45”:
private class PercentEntryValueChangeHandler implements ValueChangeHandler<String>
{
@Override
public void onValueChange(ValueChangeEvent<String> event)
{
validatePercent((TextBox) event.getSource());
}
};
private void validatePercent(final TextBox percentTextBox)
{
try
{
if (!percentTextBox.getText().isEmpty())
{
final float val = (float) _formatFloat.parse(percentTextBox.getText());
if (isValid(val))
percentTextBox.setText(_formatFloat.format(val));
else
{
percentTextBox.setFocus(true);
percentTextBox.setText("");
Window.alert("Please give me a valid value!");
}
}
}
catch (NumberFormatException e)
{
percentTextBox.setFocus(true);
percentTextBox.setText("");
Window.alert("Error: entry is not a valid number!");
}
}
private boolean isValid(float val) { return 12.5 < val && val < 95.5; }
txt.addValueChangeHandler(new PercentEntryValueChangeHandler());
将20.45格式化为“20,45”:
float val = 20.45;
txt.setText(_formatFloat.format(val));
将0.2045格式化为“20,45%”(只读过程,文本框不可编辑,%在文本框内设置):
float val = 0.2045;
txt.setText(_formatPercent.format((double)(val))); // * 100 embedded inside format.
这不是花哨的,可能远非完美,但它有效! 任何有关如何改进此实施的反馈都非常受欢迎和赞赏! 无论如何,我希望它有所帮助。
答案 1 :(得分:0)
我设法通过将代码更改为以下内容来使其工作:
private void validateNumber(String newVal){
double val=0;
try{
val=getFormatter().parse(newVal);
}catch(NumberFormatException e){
boolean ok=false;
try{
val=NumberFormat.getDecimalFormat().parse(newVal);
ok=true;
}catch(NumberFormatException e1){}
if(!ok){
try{
val=Double.parseDouble(newVal);
}catch(NumberFormatException ex){
setValue(current,false);
// inform user
Window.alert(Proto2.errors.myTextField_NAN(newVal));
return;
}
}
}