Frage

Ich bin mit Spring CustomNumberEditor Editor meinen Float-Werten zu binden, und ich habe experimentiert, dass, wenn in dem Wert keine Zahl ist manchmal kann es den Wert analysieren und kein Fehler zurückgegeben.

  • number = 10 ...... dann ist die Nummer 10 und es gibt keine Fehler
  • number = 10a ...... dann ist die Nummer 10 und es gibt keine Fehler
  • number = 10a25 ...... dann ist die Nummer 10 und es gibt keine Fehler
  • Anzahl = ein ...... Fehler, weil die Zahl nicht gültig

So scheint es, dass der Editor den Wert analysiert, bis es kann und lassen Sie den Rest. Gibt es eine Möglichkeit, diesen Editor zu konfigurieren, so dass die Validierung streng ist (so wie Zahlen 10a oder 10a25 Ergebnis in Fehler) oder muss ich auf meine benutzerdefinierte Implementierung bauen. Ich suche etwas wie nachsichtig falsch in CustomDateEditor / Dateformat Einstellung so Daten können nicht auf die wahrscheinlichste analysiert werden.

So wie ich den Editor registrieren ist:

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

Danke.

War es hilfreich?

Lösung

Da es auf der Number Klasse beruht, die auf den ersten ungültigen Zeichen der Eingabezeichenfolge stoppt Parsen Ich denke, Sie werden die Number Klasse erweitern müssen.

den ersten Blick wäre

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
}

Andere Tipps

Sie können nicht tun, um diese WHITH Number.

Die Dokumentation ist klar, über diese Tatsache:

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

Wenn Sie acceept diese API, es wäre sogar noch ungültig sein, einen Parser zu schreiben, das tut, was Sie wollen und die Number-Schnittstelle implementieren. Das bedeutet Sie Ihren eigenen Eigenschaftseditor stattdessen implment haben.

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

Ich denke, die eleganteste Ansatz zur Verwendung NumberFormat.parse(String,ParsePosition) wäre, so etwas wie folgt aus:

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

    ...
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top