2012-04-26 26 views
17

Düzenli ifadeyi kullanarak doğrulamak istediğim bir numaralı EditText numaram var. Doğrulamada istediğim şey.Android'de düzenli ifade nasıl kullanılır?

  1. ondalık noktadan önce ben girmek istiyorum maksimum haneli üçtür ve basamaklı ı girmek isteyen maksimum rakam gibi biridir sıfır ondalık noktadan sonra vb

  2. 2,23,342 gibi başlamak gerekir 0,1, 0,3, 0,6 vb

Yani ben kullanıcı girmesine izin sayıdır gibi 2.1, 32.5, 444.8, 564.9 vb

Ama Benim kodunda neler Kullanıcının 3456, 4444, 5555 gibi ondalık noktasından önce daha sonra üç haneli numarasını girmesi IS-

  1. olur ve bundan sonra bu beni bundan sonra virgül girmek için izin vermez.

  2. Ondalık noktadan önce 0'ı basamağın başlangıcı olarak girmeme izin verir.

Neden böyle oluyor, kullandığım normal ifademde yanlış bir şey var. Eğer birileri bunu çözmemde bana yardımcı olursa. Ben kullandım

Kod

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

http://stackoverflow.com/a/2811058/1160207 bakın, http://stackoverflow.com/a/4174811/1160207. Sana yardım edecektir. –

+0

Çözümü aldınız mı? – 5hssba

cevap

18

; Bu alanda zaten mevcut olan şey. Normal ifade eşleşmesini source ile değiştirin ve yalnızca belirli karakterlerin alana kabul edildiğini kontrol etmek istediğinizde uygun olur. Ancak, alan biçimlendirmesini kontrol etmek, sadece karakter bazında girdiyi filtrelemek değil. Bu çok daha karmaşık.

kullanıcı tempEditText içeriğine bir değişiklik yapar her zaman, sistem filtrenizin filter yöntem değişikliği gerçekten yapıldığı önce çağırır. Mevcut alan içeriğini ve önerilen değişikliği (ekleme/ekleme, silme veya değiştirme) geçirir. Değişiklik, bir kaynak CharSequence source (— karakterleri alana eklenecekse — karakterleri), kaynaktaki aralık başlangıç ​​ve bitiş dizinleriyle (aralıktüm zorunlu değildir), bir Spanned dest (geçerli alan içeriği) ile temsil edilir. dest içinde belirtilen source aralığı ile değiştirilmesi önerilen önerme ve dendtart ve dend dizinleri.

filter iş değişikliğini değiştirmek (gerekirse) ve (devam edin ve source kullanmak veya null) source yerine (bütünüyle) kullanmak için bir CharSequence döndürmektir. Şu anda yaptığınız gibi dest'u kontrol etmek yerine, değişikliğin kabul edilebilir bir alanla sonuçlanıp sonuçlanmadığını kontrol etmeniz gerekecektir. Bunu yapmak için daha karmaşık bir mantığa ihtiyacınız olacak. (Özellikle, yeni karakter (ler) in, sondan başka bir yere eklenmek üzere tasarlanabileceğini unutmayın, ayrıca kullanıcı, karakterleri de sildiğinde, filter çağrılır.)

TextWatcher'u uygulamak daha kolay. beforeTextChanged yönteminde, mevcut içeriği kaydedebilir ve afterTextChanged yönteminde, içeriğin kabul edilebilir olup olmadığını ve (değiştirilmeden önce içeriği değiştirip değiştirmediğini) kontrol edip (düzenli bir ifade kullanarak) kontrol edebilirsiniz. (Ancak, değişiklikten önceki metnin kabul edilebilir olduğundan emin olun. Değilse, alanın silinmesi gibi — kabul edilebilir bir şey kullanın. Aksi halde, kodunuz sonsuz bir döngüye girecektir, çünkü TextWatcher tekrar tekrar çağrılacaktır. alan içeriğini düzeltin.)

Düzenli ifadenizde de bir hata var: baştaki bir sıfıra izin veriyor.

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

: İşte bu sorunu giderir (ve gereksiz parantez kümesi kaldırır) geliştirilmiş bir versiyonu (bir kenara gibi:. Eğer [0-9] yerine \\d kullanabilirsiniz)

DÜZENLEME

Yaptığım düzenlemenin düzenlemesi:

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

Cevabımı düzenledim ve TextWatcher'ı kullanarak yapıyorum. Ama beforeTextChange yönteminde yazacakları bir ipucu bulamıyor. Lütfen Düzenlenmiş cevabıma bakıp ne yapmam gerektiğini söyleyin. – AndroidDev

+0

@Anshuman - Önce, desen eşleştirmeyi ayrı bir yönteme taşıyın (örneğin, 'isValid' olarak adlandırılır). Ardından metni değiştirmek için TextWatcher'ınızda bir alan belirtin: 'class MyTextWatcher {private CharSequence mText; ... önce public voidTextChanged (CharSequence s, int başlangıç, int sayısı, int sonra) {mText = isValid (s)? yeni CharSequence (ler): ""; } '. Son olarak, eğer test 'afterTextChanged' içinde başarısız olursa,' weightEditText.setText (mText); 'öğesini çağırın. Ayrıca, değer artık işe yaramaz olduğundan, her zaman 'afterTextChanged''den çıkmadan önce mText = null; –

+0

@Anshuman - Ayrıca mPattern'i bir "statik final" alanı yapardım; Bir kereden fazla derlemenin bir anlamı yok. –

1

olduğunu num değilken sadece numarayı ayrıştırmak ve < 1000 olup olmadığını kontrol ve 10 * numara bir tamsayı olduğuna başladı. Muhtemelen daha okunabilir olurdu.

+0

Bana bir örnekle açıklayabilir misiniz? Benim için faydalı olacak – AndroidDev

0

Böyle bir şey deneyebilirsiniz: ^[1-9][0-9]{0,2}(\\.\\d)?$. Bu, 0 (^[1-9]) ile başlamayan herhangi bir sayı ile eşleşmeli ve bunu en fazla iki sayıyla ([0-9]{0,2}) takip etmelidir. Regex ayrıca isteğe bağlı bir ondalık değere de izin verir ((\\.\\d)?$).

İdeal olarak, dize değerini double veya float ile ayrıştırmanız ve gerçek sayısal değeri kullanarak yapmak istediğiniz doğrulamaları yapmanız gerekir. double myValue = Double.parseDouble(EditText.getText());

+0

Ben ur desen kullanılır. Şimdi tek bir hata varsa, EditText'te bir şey yazmamı ve bir şey daha eklememe izin vermiyor. Bana örnek kodumda gösterirseniz ve lütfen benim önerdiğime göre dize değerini nasıl ikiye katlayabileceğimi öneririm. – AndroidDev

+0

@Anshuman değişkeninde saklanır: Cevabımı değiştirdim. Java'da '' '' dan kaçmak zorundasınız, böylece yaptığım değişikliklere göre bunları çift olarak almanız gerekiyor. JavaDoc'a bir String'i bir çiftle nasıl ayrıştırabileceğinize de bir bağlantı ekledim. – npinti

+0

Kodumda ur desenini Pattern.compile ("(^ [1-9]) ([0-9] {0,2}) ((\\. \\ d)? $)") Gibi kullandım ;.şimdi ne olur, EditBox – AndroidDev

0

Ben aşağıdaki gibi benim kodunu kullanarak desen çalıştı:

sizin string double bir içine değerini ayrıştırmak için, Double.parseDouble(String s) şöyle kullanmanız gerekecektir. Bu işleri kusursuzca 2.1, 32.5, 444.8 olarak 564,9 vb

Kodum:

bir InputFilter yalnız dest inceleyerek bir anlamı olmadı ki zaten
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

Ama benim durumum ayrı TextView'de hata göstermek istemiyorum. Bunun yerine kullanıcının EditBox'ta yanlış rakam girmesine izin vermem. Demek istediğim, eğer rakam girişi doğruysa, o zaman sadece kullanıcının rakamı yazmasına izin verecektir. Yanlışsa, kullanıcının yazmasına izin vermez. O zaman nasıl yapılacağını biliyor musunuz – AndroidDev

2

Belki de benim uygulamam herkese yardımcı olacaktır:

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

     } 
    });