0

正規表現で使用されているパターンについて混乱しています。私が望むのは、10進数の前に、ユーザーが入力したい桁の最大数が3であり、数字がゼロで始まらないことです。小数点の前の数字を入力した後、3 桁または 2 桁または 1 桁にすることができますが、ゼロで始めることはできません。ユーザーが小数点以下 1 桁を入力できるようにしたいのですが、それは 1 桁までにする必要があります。では、これらはどのようなパターンになるのでしょうか。

例:

番号 入力可能: 1.322.3333.4999.6

番号 入力不可: 00.1.14444.67333.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;
    }
}
4

3 に答える 3

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 + "}?$");
于 2012-04-25T05:23:51.910 に答える
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 ???
于 2012-04-25T05:36:34.517 に答える
0
Pattern.compile("[1-9]{0," + (digitsBeforeZero - 1) + "}+((\\.[0-9]{0," + (digitsAfterZero - 1) + "})?)"

これを試して....

于 2012-04-25T05:28:06.933 に答える