2012-04-25 5 views
0

На самом деле, я не смущен шаблоном, используемым в моем регулярном выражении. Фактически, я хочу, чтобы до десятичного значения максимальное число цифр, которое пользователь хочет ввести, равно трем, а цифра не должна начинаться с нуля. После ввода цифры до десятичной точки, которая может быть трехзначной или двухзначной или одной цифры, но не может начинаться с нуля. Я хочу разрешить пользователю вводить одну цифру после десятичной точки, и она должна быть не более одной. Итак, какова будет картина для них.Регулярное выражение не работает должным образом в соответствии с требованием

Пример:

Число Разрешить ввести: 1,3, 22,3, 333.4,999.6

Количество Не разрешено вводить: 0, 0,1, 0,1, 4444,67, 333,78

код я использовал

tempEditText.setFilters(new InputFilter[]{new DecimalDigitsInputFilter(3,1)}); 

class DecimalDigitsInputFilter implements InputFilter 
{ 

    Pattern mPattern; 

    public DecimalDigitsInputFilter(int digitsBeforeZero, int digitsAfterZero) 
    { 
     mPattern = Pattern.compile("[0-9]{0," + (digitsBeforeZero - 1) + "}+((\\.[0-9]{0," + (digitsAfterZero - 1) + "})?)"); 
    } 

    @Override 
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) 
    { 
     Matcher matcher = mPattern.matcher(dest); 
     if(!matcher.matches()) 
     { 
      return ""; 
     } 
     return null; 
    } 

} 

ответ

1

Я думаю, что модель вы хотите:

^[1-9]\d{0,2}\.\d?$ 

Объяснение:

^  // Start of string 
[1-9] // First digit can't be 0 
\d{0,2} // Zero, one, or two more digits after first digit 
\.  // Literal decimal point 
\d?  // Optional single digit after decimal point 
$  // End of string 

В своем коде, это было бы:

mPattern = Pattern.compile("^[1-9]\\d{0," + (digitsBeforeZero - 1) 
      + "}(\\.\\d{0," + digitsAfterZero + "})?$"); 

Скобки, действовавшие вокруг десятичной точки и обратная цифра означает, что число, подобное «1», не совпадают. Вот версия, что делает требуется десятичная точка, а цифра (ы) после необязательная:

mPattern = Pattern.compile("^[1-9]\\d{0," + (digitsBeforeZero - 1) 
      + "}\\.\\d{0," + digitsAfterZero + "}?$"); 
+0

Что d here.Can u Пожалуйста отредактирован это в моем коде. Фактически m застрял в нем с часом. – AndroidDev

+0

Вы должны группировать точку и последнюю цифру вместе, в противном случае она позволяет «1.» – stema

+0

@Anshuman - '\ d' - это то же самое, что' [0-9] '. Это означает «любой символ цифры». Вам нужно будет удвоить символы '\' в шаблоне, чтобы сделать его строкой Java: '^^[1-9] \\ d {0,2} \\. \\ d? $" ' –

0
Pattern.compile("[1-9]{0," + (digitsBeforeZero - 1) + "}+((\\.[0-9]{0," + (digitsAfterZero - 1) + "})?)" 

попробовать это ....

0

У вас есть следующие проблемы:

"[0-9]{0," + (digitsBeforeZero - 1) + "}+((\\.[0-9]{0," + (digitsAfterZero - 1) + "})?)" 
^^^^^           ^
    1             2 
  1. Ваш шаблон позволяет 0 в начале, но вы не хотите, чтобы ведущий 0

  2. Вы разрешаете 0 цифр после точки, но вы не хотите этого.

  3. Вы должны анкеры вокруг регулярных выражений, чтобы избежать частичных совпадений ("Foo123.4Bar" будет разрешено)

Так что попробуйте это

mPattern = Pattern.compile("^[1-9][0-9]{0," + (digitsBeforeZero - 1) + "}((\\.[0-9]{1," + (digitsAfterZero - 1) + "})?)$"); 
                              ^^^^ 
                             really -1 ??? 
+0

Потенциальные кванторы поддерживаются в Android. –

+0

@stema не позволяет вводить цифру в EditBox – AndroidDev

+0

@Anshuman Проверьте в своем отладчике, как выглядит ваш шаблон (вы можете получить его из скомпилированного шаблона с помощью 'mPattern.pattern()') и проверить, также в отладчик, как выглядит строка, которую вы пытаетесь сопоставить. – stema

Смежные вопросы