2011-06-27 3 views
3

Je souhaite valider une entrée sous la forme d'un nombre entier. Ainsi, toute valeur avec des fractions décimales doit être filtrée. Mais je ne sais pas comment y parvenir. J'ai essayé beaucoup de choses, mais avec le code ci-dessous, si l'entrée est "61.2", la valeur est convertie en 61, juste en tronquant la partie décimale. Mais je veux forcer une erreur de validation. Je suis sûr que je peux le faire sans un validateur personnalisé. Mercivalidation des entrées décimales dans JSF

<p:inputText size="5" value="#{bean.intValue}" converter="#{Integer}"> 
    <f:convertNumber pattern="#0" integerOnly="true" maxFractionDigits="0"/> 
</p:inputText> 

Répondre

12

Ce n'est pas possible car la validation s'exécute après la conversion. Vous devez essentiellement le lier à une propriété String au lieu d'une propriété Integer afin de valider la valeur non convertie. Vous devez ensuite le convertir dans le setter de propriétés ou dans la méthode d'action bean géré. Donc, si vous en faites une propriété String, vous pouvez utiliser <f:validateRegex> pour cela.

<h:inputText value="#{bean.input}" validatorMessage="Please enter digits only"> 
    <f:validateRegex pattern="\d*" /> 
</h:inputText> 

Alternativement, et l'OMI mieux que cela convertir manuellement dans la méthode setter ou une action, vous pouvez apporter dans un convertisseur de mesure qui étend la norme JSF IntegerConverter et valider le modèle là-bas juste avant la date de conversion.

@FacesConverter("digitsOnly") 
public class DigitsOnlyConverter extends IntegerConverter { 

    @Override 
    public Object getAsObject(FacesContext context, UIComponent component, String value) throws ConverterException { 
     if (!value.matches("\\d*")) { 
      throw new ConverterException(); 
     } 

     return super.getAsObject(context, component, value); 
    } 

} 

avec

<h:inputText value="#{bean.input}" converterMessage="Please enter digits only"> 
    <f:converter converterId="digitsOnly" /> 
<h:inputText> 
0

place minFractionDigits = "0" et pattern = "# # #"