我真的无法找到正则表达式的任何变通方法来输入十进制的价格。 这就是我想要的: -
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方法中执行此操作”。
答案 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个数字。