1

我真的找不到任何正则表达式以十进制输入价格的解决方法。这就是我想要的:-

12345

12345.1

12345.12

12345.123

.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})))$工作正常。

谁有好的解释。

“我正在使用 NSRegularExpression - 目标 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");

编辑 2:
无需经历获取服务器文化的麻烦,只需将 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 之后 max 那么您需要这样的东西:

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

就您的正则表达式之间的差异而言,第一个将小数点标记之前的位数长度限制为 1-5,有和没有小数。第二个只允许小数点指针前面有一个数字,如果没有小数点,则允许 1-5 位数字。

于 2013-04-25T10:07:10.660 回答