2012-04-26 10 views
17

Ho un numero EditText che voglio convalidare usando l'espressione regolare. In convalida quello che voglio è.Come utilizzare l'espressione regolare in Android

  1. prima della virgola la cifra massima voglio entrare è di tre e la cifra non dovrebbe iniziare con lo zero come 2,23,342 ecc

  2. Dopo il punto decimale della cifra massima voglio entrare è uno come 0,1, 0,3, 0,6, ecc

Così il numero che mi permetto all'utente di inserire è come 2,1, 32,5, 444,8, 564,9 ecc

Ma nel mio codice cosa succede è-

  1. Permette all'utente di inserire più di tre cifre prima della virgola come 3456, 4444, 5555 e dopo che non mi permette di entrare punto decimale dopo.

  2. Mi consente di inserire 0 prima del punto decimale come inizio della cifra.

Quindi, perché questo accade, c'è qualcosa di sbagliato nella mia espressione regolare che ho usato. Se qualcuno sa aiutarmi a risolvere questo problema.

codice che ho utilizzato è

weightEditText.addTextChangedListener(new TextWatcher() 
    {   
     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count){     
     }   
     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, 
       int after){   
     }   
     @Override 
     public void afterTextChanged(Editable s) 
     { 
      Pattern mPattern = Pattern.compile("^([1-9][0-9]{0,2})?(\\.[0-9]?)?$"); 

      Matcher matcher = mPattern.matcher(s.toString());    
      if(!matcher.find()) 
      { 
       weightEditText.setText(); // dont know what to place      
      } 
     } 
    }); 
+0

Vedere http://stackoverflow.com/a/2811058/1160207 e http://stackoverflow.com/a/4174811/1160207. Ti aiuterà. –

+0

Hai trovato la soluzione? – 5hssba

risposta

18

Non c'è mai un punto qualsiasi esame dest da solo in un InputFilter; questo è ciò che è già presente nel campo. Modificare la corrispondenza dell'espressione regolare in modo che sia contro source e sarebbe opportuno se si desidera solo verificare che alcuni caratteri siano stati accettati nel campo. Tuttavia, si desidera verificare la formattazione dei campi, non solo filtrare l'input sulla base di un carattere per carattere. Questo è molto più complesso.

Ogni volta che l'utente apporta una modifica al contenuto del tempEditText, il sistema chiama filter il metodo del filtro prima il cambiamento è in realtà composto. Passa il contenuto del campo corrente e la modifica proposta (che può essere inserita/aggiunta, eliminata o sostituita). Il cambiamento è rappresentato da una fonte CharSequence source (i caratteri — se uno qualsiasi — da aggiungere al campo), gli indici di inizio e fine intervallo all'interno della sorgente (l'intervallo non è necessariamente tutto source), uno Spanned dest (il contenuto del campo corrente prima la modifica) e la gamma dstart e dend indexes all'interno di dest che si propone di sostituire con la gamma indicata source.

Il lavoro di filter è quello di modificare il cambiamento (se necessario) e restituire un CharSequence da utilizzare (nella sua interezza) al posto di source (o null di andare avanti e usare source). Anziché controllare dest come si sta facendo ora, sarà necessario verificare se la modifica risulterà in un campo accettabile. Per fare ciò, avrai bisogno di una logica più complessa. (Si noti, in particolare, che il nuovo carattere può essere inteso per inserimenti da qualche altra parte alla fine, inoltre, filter verrà chiamato quando l'utente sta eliminando i caratteri e li aggiunge.)

Potrebbe essere più facile da implementare a TextWatcher. Nel suo metodo beforeTextChanged, è possibile registrare il contenuto corrente e nel suo metodo afterTextChanged, è possibile controllare (utilizzando un'espressione regolare) se i contenuti sono accettabili e, in caso contrario, ripristinare i contenuti prima della modifica. (Assicurati, però, che il testo prima della modifica fosse accettabile.Se non lo è, sostituisci qualcosa di accettabile — come cancellare il campo, altrimenti il ​​tuo codice andrà in un ciclo infinito perché il TextWatcher verrà richiamato di nuovo quando tu correggere il contenuto del campo.)

Si ha anche un errore nell'espressione regolare: consente uno zero iniziale. Ecco una versione migliorata che risolve questo problema (e rimuove una serie di parentesi non necessarie):

"^([1-9][0-9]{0,2})?(\\.[0-9]?)?$" 

(Per inciso:. È possibile utilizzare \\d invece di [0-9])

EDIT

Ecco la mia modifica della tua modifica:

weightEditText.addTextChangedListener(new TextWatcher() 
{   
    private static final Pattern sPattern 
     = Pattern.compile("^([1-9][0-9]{0,2})?(\\.[0-9]?)?$"); 

    private CharSequence mText; 

    private boolean isValid(CharSequence s) { 
     return sPattern.matcher(s).matches(); 
    } 

    @Override 
    public void onTextChanged(CharSequence s, int start, int before, int count){ 
    }   

    @Override 
    public void beforeTextChanged(CharSequence s, int start, int count, 
      int after){ 
     mText = isValid(s) ? new CharSequence(s) : ""; 
    }   

    @Override 
    public void afterTextChanged(Editable s) 
    { 
     if (!isValid(s)) 
     { 
      weightEditText.setText(mText); 
     } 
     mText = null; 
    } 
}); 
+0

Ho modificato la mia risposta e lo faccio usando TextWatcher. Ma non è in grado di trovare un indizio su cosa scrivere nel metodo beforeTextChange. puoi per favore guardare la mia risposta modificata e dirmi cosa dovrei fare. – AndroidDev

+0

@Anshuman: in primo luogo, sposta la corrispondenza del modello in un metodo separato (chiamato, ad esempio, 'isValid'). Quindi dichiarare un campo in TextWatcher per memorizzare il testo prima della modifica: 'class MyTextWatcher {private CharSequence mText; ... public void beforeTextChanged (CharSequence s, int start, int count, int after) {mText = isValid (s)? nuovo CharSequence (s): ""; } '. Infine, se il test fallisce in 'afterTextChanged', chiama' weightEditText.setText (mText); '. Inoltre, imposta sempre 'mText = null;' prima di uscire da 'afterTextChanged' poiché il valore è ora inutile. –

+0

@Anshuman - Vorrei anche rendere mPattern un campo 'static final'; non ha senso compilarlo più di una volta. –

1

si può solo analizzare il numero e controllare che sia < 1000 e che il 10 il numero * è un numero intero, mentre num non è. Probabilmente sarebbe anche più leggibile.

+0

Puoi spiegarmi un esempio.è utile per me – AndroidDev

0

Si potrebbe provare qualcosa di simile: ^[1-9][0-9]{0,2}(\\.\\d)?$. Ciò dovrebbe corrispondere a qualsiasi numero che non inizia con 0 (^[1-9]) ed è seguito da al massimo due numeri ([0-9]{0,2}). La regex consente anche un valore decimale facoltativo ((\\.\\d)?$).

Detto questo, idealmente si dovrebbe analizzare il valore di stringa su un double o su float e fare sempre le convalide che è necessario effettuare utilizzando il valore numerico effettivo.

per analizzare il vostro string in un double valore, è necessario utilizzare il Double.parseDouble(String s) in questo modo: double myValue = Double.parseDouble(EditText.getText());

+0

Ho usato il tuo modello. Ora non mi permette di digitare nulla in EditText e un'altra cosa se ho usato il singolo \ l'errore mostra. Sarà meglio se mi mostri nel mio codice di esempio e ti prego di suggerirmi come posso analizzare il valore della stringa da raddoppiare perché è memorizzato nella variabile dest Spanning – AndroidDev

+0

@Anshuman: Ho cambiato la mia risposta. In Java è necessario eseguire l'escape di '\ quindi è necessario averli in coppia, in base alle modifiche apportate. Ho anche incluso un collegamento a JavaDoc su come è possibile analizzare una stringa su un doppio. – npinti

+0

Ho usato ur pattern nel mio codice come Pattern.compile ("(^ [1-9]) ([0-9] {0,2}) ((\\. \\ d)? $)") ;.ora quello che succede è che non mi permette di digitare alcun numero nell'EditBox – AndroidDev

0

ho cercato il vostro modello usando il mio codice come segue. Funziona perfettamente come 2,1, 32,5, 444,8, 564,9 ecc

Il mio codice:

public class WebPush extends Activity { 
    EditText editTxt; 
    private TextView regresult; 

    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     editTxt = (EditText) findViewById(R.id.editID); 
     regresult = (TextView) findViewById(R.id.txtID); 

     String urName = editTxt.getText().toString(); 
     editTxt.addTextChangedListener(new TextWatcher() { 

      @Override 
      public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { 
      } 

      @Override 
      public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,int arg3) { 
      }  

      @Override 
      public void afterTextChanged(Editable s) { 
       if (editTxt.getText().toString().matches("(^([0-9]{0,3})?)(\\.[0-9]{0,1})?$")) 
       { 
        regresult.setText(""); 
       } 
       else 
       { 
        regresult.setText("invalid number"); 
       } 
      } 
     }); 
    } 
} 
+0

Ma nel mio caso non voglio mostrare l'errore in TextView separato. Invece non permetto all'utente di inserire cifre errate nell'EditBox. Intendo dire che se la cifra inserita è corretta, solo così permetterà all'utente di digitare la cifra. Se è sbagliato, allora non consente all'utente di digitare. Quindi sai come si può fare – AndroidDev

2

Forse la mia implementazione aiuterà chiunque:

etRepeaterCallsign.addTextChangedListener(new TextWatcher() { 
     private final Pattern sPattern 
       = Pattern.compile("^([A-Z]{0,2})?(\\d)?([A-Z-]{0,5})"); // ^([1-9][0-9]{0,2})?(\\.[0-9]?)?$ 

     private CharSequence mText; 

     private boolean isValid(CharSequence s) { 
      return sPattern.matcher(s).matches(); 
     } 

     @Override 
     public void beforeTextChanged(CharSequence r, int start, int count, 
             int after) { 
      mText = r.toString(); 
     } 

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) { 
      bIsEdit = true; 
     } 
     @Override 
     public void afterTextChanged(Editable s) { 
      etRepeaterCallsign.removeTextChangedListener(this); 

      int iCursorPosition = etRepeaterCallsign.getSelectionStart(); 
      etRepeaterCallsign.setText(""); 
      if (isValid(s)) 
       etRepeaterCallsign.append(s); 
      else 
       etRepeaterCallsign.append(mText); 

      etRepeaterCallsign.setSelection(iCursorPosition); 

      etRepeaterCallsign.addTextChangedListener(this); 

     } 
    }); 
Problemi correlati