5

我正在使用 Spring CustomNumberEditor 编辑器绑定我的浮点值,并且我已经试验过,如果值不是数字,有时它可以解析该值并且不返回错误。

  • number=10 ...... 那么数字是 10 并且没有错误
  • number=10a ...... 那么数字是 10 并且没有错误
  • number=10a25 ...... 那么数字是 10 并且没有错误
  • number=a ......错误,因为数字无效

因此,编辑器似乎会解析该值,直到可以并省略其余部分。有没有办法配置这个编辑器,所以验证是严格的(所以像 10a 或 10a25 这样的数字会导致错误)或者我必须构建我的自定义实现。我正在寻找类似在 CustomDateEditor/DateFormat 中将 lenient 设置为 false 的东西,因此无法将日期解析为最可能的日期。

我注册编辑器的方式是:

@InitBinder
public void initBinder(WebDataBinder binder){
    NumberFormat numberFormat = NumberFormat.getInstance();
    numberFormat.setGroupingUsed(false);
    binder.registerCustomEditor(Float.class, new CustomNumberEditor(Float.class, numberFormat, true));
}

谢谢。

4

3 回答 3

7

NumberFormat 无法做到这一点。

文档清楚地说明了这一事实:

/**
 * Parses text from the beginning of the given string to produce a number.
 * The method may not use the entire text of the given string.
 * <p>
 * See the {@link #parse(String, ParsePosition)} method for more information
 * on number parsing.
 *
 * @param source A <code>String</code> whose beginning should be parsed.
 * @return A <code>Number</code> parsed from the string.
 * @exception ParseException if the beginning of the specified string
 *            cannot be parsed.
 */
public Number parse(String source) throws ParseException {

当您接受此 API 时,编写一个执行您想要的操作并实现 NumberFormat 接口的解析器甚至是无效的。这意味着您必须改为实现自己的属性编辑器。

/* untested */
public class StrictNumberPropertyEditor extends PropertyEditorSupport {

    @Override
    public void setAsText(String text) throws IllegalArgumentException {
       super.setValue(Float.parseFloat(text));
    }

    @Override
    public String getAsText() {
        return ((Number)this.getValue()).toString();
    }    
}
于 2011-01-18T18:18:28.117 回答
4

由于它依赖于 NumberFormat 类,它会在第一个无效字符处停止解析输入字符串,我认为您必须扩展 NumberFormat 类。

第一次脸红是

public class StrictFloatNumberFormat extends NumberFormat {

  private void validate(in) throws ParseException{
     try {
       new Float(in);
     }
     catch (NumberFormatException nfe) {
       throw new ParseException(nfe.getMessage(), 0);     
  }


  public Number parse(String in) throws ParseException {
    validate(in);
    super.parse(in);
  }
  ..... //any other methods
}
于 2011-01-18T17:48:59.940 回答
3

我认为最优雅的方法是使用NumberFormat.parse(String,ParsePosition),如下所示:

public class MyNumberEditor extends PropertyEditorSupport {
    private NumberFormat f;
    public MyNumberEditor(NumberFormat f) {
        this.f = f;
    }

    public void setAsText(String s) throws IllegalArgumentException {
        String t = s.trim();
        try {
            ParsePosition pp = new ParsePosition(0);
            Number n = f.parse(t, pp);
            if (pp.getIndex() != t.length()) throw new IllegalArgumentException();
            setValue((Float) n.floatValue());
        } catch (ParseException ex) {
            throw new IllegalArgumentException(ex);
        }
    }

    ...
}
于 2011-01-18T18:28:16.543 回答