2016-04-25 35 views
5

我不确定这是否可能与正则表达式。我会尝试使用正则表达式,但如果不可能,我会切换到双重验证。最大长度为小数的正则表达式

我的数据库(postgresql)接受decimal为15,6(最多15个数字,最多6个小数),所以如果我有10个整数数字,我可以有5个小数位数。小数点分隔符被忽略。

目前,我有这个正则表达式(逗号是小数点分隔符):

^\d{1,15}(\,\d{1,6})?$

它不验证的总长度,只有数字到左边。 但由于用户还可以键入点(千位分隔符),我有这个怪物:

^((\d+)|(\d{1,3}(\.\d{3})+)|(\d{1,3}(\.\d{3})(\,\d{3})+))((\,\d{4})|(\,\d{3})|(\,\d{2})|(\,\d{1})|(\,))?$

这一个不接受超过3位小数。我可以编辑这个接受6次decimais,但我仍然无法验证总长度。

是否可以验证数字的总长度?忽略点和逗号。

正则表达式应该接受:

1234567890,123456

1.234.567.890,123456

,当然还有其他任何中间值:

1.234,121,01 ...

+0

你使用哪种语言?标记可能有助于获得更多关注。 –

+0

好的,这是c#。谢谢。 –

+0

你想做什么?小数是数字,而不是文本值。他们没有分隔符。如果你想*验证一个值,你可以在DTO级别使用UI验证器和数据注解等。 –

回答

2

我想你需要

^(?:\d{1,3}(?:\.\d{3}){0,4}|\d{1,15})(?:,\d{1,6})?$ 

参见regex demo

整数部分只允许1到15位(或5个基团与.数字分组符号分离3位数组块),并可选地跟随一个逗号和1到6个十进制数字。

  • ^ - 开始字符串的
  • (?:\d{1,3}(?:\.\d{3}){0,4}|\d{1,15}) - 2替代:
    • \d{1,3}(?:\.\d{3}){0,4} - 1至3位数,随后用点的(\.)0至4个序列和3位数字(\d{3}
    • | - 或
    • \d{1,15} - 1至15个数字
  • (?:,\d{1,6})? - 逗号的可选序列(1或0次),然后用1至6个数字
  • $ - 串
+0

总长度不能大于15,包括小数位数。所以这里有一个小小的改变:'((你的正则表达式){1,15})?$'但我可能是错的。 –

+0

我怀疑'^((你的正则表达式){1,15})?$'是你所需要的,它会匹配更多...但是,你对数据有更多的了解,很高兴能够提供帮助。 –

+0

它如何匹配更多? –

0

试试这个:^[\d\.\,]{1,15}([\.\,]\d{0,6})?$

+1

这将允许123456789,123456。 – colburton

+0

不错,它忽略了点和逗号,但它接受'123456789011111,123456',忽略长度限制。 –

+0

@NickeManarin你想做什么? .NET有验证器和数据注释,它们允许您验证小数值而不将它们转换为文本,并且必须处理负数,千位和小数分隔符 –

3

只要抛出了这一点作为替代的端部。在我看来,你不应该在这种情况下使用正则表达式。为什么?因为正确匹配问题的正则表达式不容易理解。

该问题存在更简单的解决方案。举例来说:

var input = "1.234.567.890,123456"; 
var input2 = Regex.Replace(input, @"[^\d,]+", ""); 

var split = input2.Split(','); 
var totalLength = split[0].Length + split[1].Length; 

没什么特别的。但它的工作原理与迄今为止提供的其他解决方案不同。

但是不同的文化背景呢?不同的文化使用不同的千分离器。这就是像Double.TryParse可以进来:

var input = "1.234.567.890,123456"; 

var style = NumberStyles.Number; 
var culture = CultureInfo.CreateSpecificCulture("nl-NL"); 

double result; 
if (double.TryParse(input, style, culture, out result)) 
{ 
    Console.WriteLine("It worked!"); 
} 
else 
{ 
    Console.WriteLine("Not valid"); 
} 

上述工作,因为nl-NL文化使用的格式。将其设置为en-US,它将失败。

既没有真正使用正则表达式来完成工作,但他们仍然可以产生预期的结果。

+0

我使用类似这样的东西,使用正则表达式来验证数千和小数分隔符,并使用'text.Replace(“。”,“”).Replace(“,”,“”)'来获得总长度。谢谢,我会停止使用正则表达式来处理这种情况。 –

相关问题