Question

J'utilise éditeur Spring CustomNumberEditor pour lier mes valeurs flottantes et je l'ai expérimenté que si la valeur est pas un nombre parfois, il peut analyser la valeur et aucune erreur est renvoyée.

  • number = 10 ...... alors le nombre est de 10 et il n'y a pas d'erreur
  • = numéro 10a ...... alors le nombre est de 10 et il n'y a pas d'erreur
  • = nombre 10a25 ...... alors le nombre est de 10 et il n'y a pas d'erreur
  • Numéro = a ...... erreur parce que le nombre est pas valide

Il semble donc que l'éditeur parse la valeur jusqu'à ce qu'il peut et omettre le reste. Est-il possible de configurer cet éditeur si la validation est stricte (et donc les chiffres tels que 10a ou 10a25 résultat par erreur) ou dois-je construire mon implémentation personnalisée. Je cherche quelque chose comme la mise indulgente false dans CustomDateEditor / DateFormat si les dates ne peuvent être analysées au plus un probable.

La façon dont j'enregistrer l'éditeur est:

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

Merci.

Était-ce utile?

La solution

Comme il est basé sur la classe NumberFormat, qui arrête l'analyse de la chaîne d'entrée au premier caractère invalide Je pense que vous devrez étendre la classe NumberFormat.

D'abord blush serait

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
}

Autres conseils

Vous ne pouvez pas le faire cinque NumberFormat.

La documentation est claire sur ce fait:

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

Lorsque vous acceept cette API, il serait même même invalide d'écrire un analyseur qui fait ce que vous voulez et implémenter l'interface NumberFormat. Cela signifie que vous devez implment votre éditeur de propriétés à la place.

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

Je pense que l'approche la plus élégante serait d'utiliser NumberFormat.parse(String,ParsePosition), quelque chose comme ceci:

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

    ...
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top