Objective c 验证价格的正则表达式(十进制)

Objective c 验证价格的正则表达式(十进制),objective-c,regex,Objective C,Regex,我真的找不到任何解决办法让正则表达式以十进制输入价格。 这就是我想要的:- 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”,

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

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);
}
“我是用按钮式的方法来做的。”

这个怎么样:
^([+-])?(\d+)([,])?(\d+)$

编辑:
哦-哦-刚刚意识到如果一个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
);
这个怎么样:
^([+-])?(\d+)([,])?(\d+)$

编辑:
哦-哦-刚刚意识到如果一个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
);
让我们分两部分来做:

  • 在开头签名:
    [+-]?
  • 分数编号:
    \。\d+
  • 可能的组合(符号后):
    • 编号:
      \d+
    • 不带零的分数
      \。\d+
    • 带分数的数字:
      \d+\.\d+
因此,要将其全部连接起来
(数字|分数不为零|数字带分数)

让我们分两部分来做:

  • 在开头签名:
    [+-]?
  • 分数编号:
    \。\d+
  • 可能的组合(符号后):
    • 编号:
      \d+
    • 不带零的分数
      \。\d+
    • 带分数的数字:
      \d+\.\d+
因此,要将其全部连接起来
(数字|分数不为零|数字带分数)


这个简单的应该适合您的需要:

\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}
)”

这个简单的数字应该适合您的需要:

\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}
)”.

如果不将长度限制为小数点前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个数字。

如果不将长度限制为小数点前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个数字。

ahahahahahahahaha,这忽略了+/-和第一个数字之间有一个(可选)空格的可能性…哦,等等,我错了,double.TryParse也不允许在-和数字之间有空格。为.NET framework提交了错误785552:)使用NSRegularExpression尝试了123、123.45,但无法使用NSRegularExpression-目标C,,,仍未解决…@gagansharma我从未使用过NSRegularExpression,但可能您必须双倍避开反斜杠:
\