2011-01-18 30 views
5

Tôi đang sử dụng trình chỉnh sửa Spring CustomNumberEditor để liên kết các giá trị float của mình và tôi đã thử nghiệm rằng nếu giá trị không phải là số đôi khi nó có thể phân tích giá trị và không có lỗi nào được trả về.Spring CustomNumberEditor phân tích các số không phải là số

  • number = 10 ...... thì số là 10 và không có lỗi
  • number = 10a ...... thì số là 10 và không có lỗi
  • number = 10a25 ...... thì số là 10 và không có lỗi
  • số = a ...... lỗi vì số không hợp lệ

vì vậy, có vẻ như các biên tập viên phân tích giá trị cho đến khi nó có thể và bỏ qua phần còn lại. Có cách nào để cấu hình trình soạn thảo này để xác nhận là nghiêm ngặt (vì vậy các con số như 10a hoặc 10a25 dẫn đến lỗi) hay tôi phải xây dựng triển khai tùy chỉnh của mình. Tôi đang tìm kiếm một cái gì đó giống như thiết lập khoan dung để sai trong CustomDateEditor/DateFormat vì vậy ngày không thể được phân tích cú pháp để có thể xảy ra nhất.

Con đường tôi đăng ký biên tập là:

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

Cảm ơn.

Trả lời

4

Vì nó dựa vào lớp NumberFormat, dừng phân tích cú pháp chuỗi đầu vào ở ký tự không hợp lệ đầu tiên, tôi nghĩ bạn sẽ phải mở rộng lớp NumberFormat.

đỏ mặt đầu tiên sẽ được

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 
} 
+0

Cảm ơn. Nhưng nếu tôi đã thực hiện tùy chỉnh của mình, tôi nghĩ rằng tôi có thể mở rộng lớp CustomNumberEditor và ghi đè phương thức setAsText nếu giá trị là một số như bạn làm và nếu nó đang xảy ra với super.setAsText – Javi

7

Bạn không thể làm hộ NumberFormat này.

Các tài liệu rõ ràng về thực tế này:

/** 
* 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 { 

Khi bạn acceept API này nó thậm chí có thể thậm chí không hợp lệ để viết một phân tích cú pháp mà những gì bạn muốn và thực hiện các giao diện NumberFormat. Điều này có nghĩa là bạn phải thay thế Trình chỉnh sửa thuộc tính của riêng mình.

/* 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(); 
    }  
} 
3

Tôi nghĩ rằng cách tiếp cận thanh lịch nhất sẽ được sử dụng NumberFormat.parse(String,ParsePosition), một cái gì đó như thế này:

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); 
     } 
    } 

    ... 
} 
Các vấn đề liên quan