Objective 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”,如果这有助于更准确地回答问题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”,
- (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,但可能您必须双倍避开反斜杠:
\