1

正規表現で価格を 10 進数で入力するための回避策を見つけることができません。これは私が欲しいものです:-

12345

12345.1

12345.12

12345.123

.123

0.123

桁数も制限したい。

私は実際に作成しましたが、想定どおりに検証していません

^([0-9]{1,5}|([0-9]{1,5}\.([0-9]{1,3})))$

また、上記の表現が1とどのように異なるかを知りたい

^([0-9]{1,5}|([0-9].([0-9]{1,3})))$正常に動作しています。

どなたか説明が上手い方。

これがより正確に答えるのに役立つ場合は、「私は NSRegularExpression - Objective C を使用しています」

- (IBAction)btnTapped {

      NSRegularExpression * regex = [NSRegularExpression regularExpressionWithPattern:
         @"^\\d{1,5}([.]\\d{1,3})?|[.]\\d{1,3}$" options:NSRegularExpressionCaseInsensitive error:&error];

     if ([regex numberOfMatchesInString:txtInput.text options:0 range:NSMakeRange(0, [txtInput.text length])]) 
         NSLog(@"Matched : %@",txtInput.text);
     else
        NSLog(@"Not Matched : %@",txtInput.text);
}

「buttonTapメソッドでやっています」。

4

4 に答える 4

8

この単純なものはあなたのニーズに合うはずです:

\d*[.]?\d+

「数字 ( \d+) の前にドット ( [.]?) を付けることができ、ドット自体の前に数字 ( \d*) を付けることができます。」

価格について話しているので、科学的表記法も負の数も必要ありません。


興味深い点として、これは私が通常使用するもので、科学表記法と負の数が含まれています。

[-+]?\d*[.]?\d+(?:[eE][-+]?\d+)?

新しい要件(コメントを参照)については、最初に指定した正規表現で必要な桁数を指定することはできません。これは、作成された方法ではないためです

これはあなたのニーズにより適しているはずです:

\d{1,5}([.]\d{1,3})?|[.]\d{1,3}

「最大 5 桁 ( \d{1,5}) の後に ( (...)?) ドット自体が続き、その後に最大 3 桁の数字が続く ( [.]\d{1,3})、または ( |) 単純にドットの後に最大 3 桁の数字が続く ( [.]\d{1,3})」 .

于 2013-04-25T10:04:09.260 に答える
1

これをパートごとにしましょう:

  • 最初にサインインします。[+-]?
  • 分数:\.\d+
  • 可能な組み合わせ (符号の後):
    • 番号:\d+
    • ゼロのない分数\.\d+
    • そして分数付きの数:\d+\.\d+

したがって、すべてを結合するには<sign>(number|fraction without zero|number with fraction)

^[+-]?(\d+|\.\d+|\d+\.\d+)$
于 2013-04-25T10:02:50.383 に答える
0

これはどう:^([+-])?(\d+)?([.,])?(\d+)?$

            string input = "bla";
            if (!string.IsNullOrWhiteSpace(input))
            {
                string pattern = @"^(\s+)?([-])?(\s+)?(\d+)?([,.])?(\d+)(\s+)?$";

                input = input.Replace("\'", ""); // Remove thousand's separator
                System.Text.RegularExpressions.Regex.IsMatch(input, pattern);
                // if server culture = de then reverse the below replace
                input = input.Replace(',', '.');
            }

編集:
ああああ-en-usユーザーが千の区切り記号として「、」を使用すると、少し問題が発生することに気付きました....

だからここにもっと良いものがあります:

        string input = "+123,456";
        if (!string.IsNullOrWhiteSpace(input))
        {
            string pattern = @"^(\s+)?([+-])?(\s+)?(\d+)?([.,])?(\d+)(\s+)?$";

            input = input.Replace(',', '.'); // Ensure no en-us thousand's separator
            input = input.Replace("\'", ""); // Remove thousand's separator
            input = System.Text.RegularExpressions.Regex.Replace(input, @"\s", ""); // Remove whitespaces

            bool foo = System.Text.RegularExpressions.Regex.IsMatch(input, pattern);
            if (foo)
            {
                bool de = false;
                if (de) // if server-culture = de
                    input = input.Replace('.', ',');

                double d = 0;
                bool bar = double.TryParse(input, out d);
                System.Diagnostics.Debug.Assert(foo == bar);

                Console.WriteLine(foo);
                Console.WriteLine(input);
            }
            else
                throw new ArgumentException("input");
        }
        else
            throw new NullReferenceException("input");

Edit2:
サーバー カルチャを取得する手間をかける代わりに、カルチャで tryparse オーバーロードを使用し、小数点記号を再置換しないでください。

double.TryParse(input 
               , System.Globalization.NumberStyles.Any
               , new System.Globalization.CultureInfo("en-US")
               , out d
);
于 2013-04-25T09:55:43.997 に答える
0

長さを小数点以下 5 桁、小数点以下 3 桁に制限しない場合は、次のように使用できます。

^[+-]?(?:[0-9]*\.[0-9]|[0-9]+)$

最大値の前に 5 つ、最大値の後に 3 つに制限する場合は、次のようなものが必要になります。

^[+-]?(?:[0-9]{0,5}\.[0-9]{1,3}|[0-9]{1,5})$

正規表現の違いに関する限り、最初の正規表現は、小数点の有無にかかわらず、小数点マーカーの前の桁数を1〜5に制限します。2 番目のものは、10 進ポインタの前に 1 桁のみを許可し、10 進がない場合は 1 ~ 5 桁を許可します。

于 2013-04-25T10:07:10.660 に答える