我需要为“text”类型输入创建一个模式,只允许从0到特定最大值的数字,同时验证特定的小数位数。
快速举例: 最大值= 300.86 最大小数位数= 3
有效输入:
0
1
300个
300.86
300.85
300.850
300.851
0.2
0.3333
输入无效:
-1
301个
300.87
300.861
1,30.2
1,0.0
,.1
目前我只知道如何使用此模式验证小数位数:
^ [0-9] *(\ d {1,{0}})?$
注意: 我不能使用type = number因为我不能使用任何模式:(
请帮助
答案 0 :(得分:0)
我认为这样的事情就是你所追求的:
^(300(?:\.(?:[0-7]\d{0,2}|8(?:[0-5]\d?|60?)?))?|[0-2]?\d{0,2}(?:\.\d{0,3})?)$
(不得不在那里进行调整,以\r
结束,因为即使选择了多行,REGEX STORM也不会将$
与行尾匹配???)
<强>解释强>
它有两个部分。后者[0-2]?\d{0,2}(?:\.\d{0,3})?
测试数字低于300.它可选择以0
,1
或2
([0-2]?
)开头。然后可以跟随任何两位数字(\d{0,2}
)。然后,可选地,它后跟一个.
,如果存在,则最多可以跟随三位数(小数)((?:\.\d{0,3})?
)。
第一部分 - 300(?:\.(?:[0-7]\d{0,2}|8(?:[0-5]\d?|60?)?))?
- 测试整数部分何时正好是300.然后可以选择后跟一个小数点,以及三分之一的情况:
[0-7]\d{0,2}
0
至7
范围内的数字,后跟最多两位数字8(?:[0-5]\d*|60*)?
8
后跟0
到5
范围内的数字,可选地后跟数字([0-5]\d?
更改)。0
(60?
更改)这些部分位于由替换 - |
分隔的捕获组中。整个表达式必须位于字符串(^
)(或带有多行标志的行)的开头,并且位于相同的末尾($
)。< / p>
修改强>
做了一些调整'导致一些数字错误地失败。
修改2
完全错过了“最大小数位数”部分。固定。 (被“有效”示例0.3333
愚弄)
答案 1 :(得分:0)
我对C#一无所知所以我不得不假设我能用Python做什么,你可以在C#中找到一些方法。我将以伪代码的形式向您提出我的建议(这不是为了反映Python)。
maxValue = some number
nDecimals = some number
givenValue = text with some number to be tested
#split number on decimal; remove non-digit characters from each side
leftSideOfDecimal = Replace(pattern = '^(\d{1,3}(,\d{3})*)(\.\d*)$', replacement = '\1', givenValue)
leftSideOfDecimal = Replace(',', '', leftSideOfDecimal)
rightSideOfDecimal = Replace('^(\d{1,3}(,\d{3})*)(\.\d*)$', '\3', givenValue)
rightSideOfDecimal = Replace('\.','',rightSideOfDecimal)
leftSideOfDecimal = pass leftSideOfDecimal to function to change type from text to integer
if leftSideOfDecimal <= maxValue and numberOfCharacters(rightSideOfDecimal) == nDecimals:
do whatever you want
或者,如果你有一个函数可以在一个给定的字符(如十进制或逗号)上拆分字符串,那么你只需在十进制上拆分输入,清理代码中的第一面,然后继续上面代码的最后三行。这样可以避免使用温和复杂的正则表达式。