用十进制验证价格的正则表达式

时间:2013-04-25 09:54:06

标签: objective-c regex

我真的无法找到正则表达式的任何变通方法来输入十进制的价格。 这就是我想要的: -

12345

12345.1

12345.12

12345.123

0.123

0.123

我也想限制数字。

我真的创建了一个但没有按照假设验证

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

还想知道上面的表达方式与

有何不同

^([0-9] {1,5} |([0-9]。([0-9] {1,3})))$ 即可正常工作。< / p>

任何有良好解释的人。

“我正在使用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 个答案:

答案 0 :(得分: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})“

答案 1 :(得分:1)

让我们这样做 per-partes

  • 登录开头:[+-]?
  • 分数:\.\d+
  • 可能的组合(签名后):
    • 号码:\d+
    • 没有零的分数\.\d+
    • 分数为\d+\.\d+
    • 的数字

所以要将它们加在一起<sign>(number|fraction without zero|number with fraction)

^[+-]?(\d+|\.\d+|\d+\.\d+)$

答案 2 :(得分: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
);

答案 3 :(得分: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,存在和不存在小数。第二个只允许十进制指针前面的一个数字,如果没有十进制,则只允许1-5个数字。