精度(p):小数点左侧和右侧的总位数
比例:小数点右侧的总位数
到目前为止考虑我的以下正则表达式:
GameView
示例:
^-?[0-9]+(\.[0-9]{1,3})?$
我知道如何限制左边的总数和右边的总数,但不知道如何封装整个值来限制“p,precision”部分,如果它存在于该计数中则忽略该句点。 - 也需要在总计数中被忽略。
更新:
这似乎有效......
100.95 has a precision of 5 and a scale of 2 (5,2)
答案 0 :(得分:1)
您可以在开头使用lookahead assertion来验证字符串中的数字是否与您需要的数字完全相同。
(?=(\D*\d\D*){5}$)
这将使你的整个表达成为:
(?=(\D*\d\D*){5}$)^-?[0-9]+(\.[0-9]{1,3})?$
(我使用shorthand character classes \d
(数字)和\D
(非数字)以简化和IMO可读性。)
它匹配数字\d
,可能包含我们不关心的非数字字符\D*
,并确保在{{1}之前恰好匹配{5}
五次结束字符串。
更新
以下是您确定的表达方式,通过一些调整进行了简化:
$
^(?=(\D*\d\D*){0,5}$)-?\d*(\.\d{0,2})?$
与\d
相同,因此您可以删除一些冗余。
[0-9]
可能真的只是([\d0-9]+)?
(不确定你是否真的使用了捕获组,在这种情况下你应该在它周围留下括号:\d*
)(\d*)
不需要\.?
,因为它可以跟随0位数,而它所在的群组已经有?
?
可以是[\d0-9]{0,2}
答案 1 :(得分:0)
作为先前答案的补充,也使用前瞻。要限制整数中的总位数,可以使用(?=(?:-?[\.0-9]{3,8}$)|(?:-?[0-9]{1,7}$))
。 3表示至少1个精度,需要1个刻度(小数点为3); 7表示整数,精度为7。
可能需要处理轻微的边缘情况。
请参阅RegEx101。
答案 2 :(得分:0)
如果要限制“p,precision”部分(例如,您希望将精度限制为5),您可以这样做:
^-?(\d{5}|\d{2}(?=\d*\.\d*)[\d.]{3}\d)$
^ # match start of line
-? # match - literally; zero or one time
( # capturing group starts
\d{5}| # match 5 digits (such as, 10095); OR
\d{2} # match 2 digits; assert at least 2 digits ahead of dot (.)
(?=\d*\.\d*) # positive lookahead; assert . (dot) can be matched ahead
[\d.]{3} # match a digit or . (dot) three times
\d # assert at least one digit at the end
) # capturing group ends
$ # match end of line
答案 3 :(得分:0)
当使用类型numeric(<precision>[,<scale>])
( note :numeric
and decimal
are synonyms)时,SQL Server实际上在小数点的左侧和右侧存储了固定数量的空格。
因此,对于以下类型:numeric(5,2)
2
位分配给小数点的右 5-2
= 3
个数字含义1234.1
与1234.10
类似,并且无效!
-- Will throw an Arithmetic Overflow Exception
DECLARE @Price AS NUMERIC(5,2) = 1234.1
因此,用于验证此结果的正则表达式比此处的某些示例更简单
查找数字\d
,您可以使用0到3个数字{0,3}
然后可以选择?
,您可以使用句点\.
,然后再输入0到2个数字\d{0,2}
整个正则表达式应如下所示:
\d{0,3}(\.\d{0,2})?
进一步阅读: