我今天发现了这种做法:
检测支票号码是否有效。支票号码必须有10位数字,后面不能有2个或更多的零,也不能有3个以上的数字
我已经能够使用以下代码完成第一部分:
num_chk=input('Enter chk number: ')
if (len(num_chk) == 10):
print('valid')
else:
print('not valid')
关于如何创建逻辑以检查支票号码是否连续2次的任何想法。
感谢
答案 0 :(得分:1)
我们说您的支票号是变量check_number
,它是12300。
check_number = 12300
convert it to a string:
str_check_num = str(check_number)
# str_check_num now equals "12300" a a string
has_00 = "00" in str_check_num
# Returns True if "00" is in str_check_num. in this case it is.
答案 1 :(得分:1)
num_chk
是str
类型,可让您访问:
a in b
- 如果字符串a在字符串b中,则返回True,例如'00' in num_chk
要检查尾随部分是否为一定数量的零,您可以尝试endswith
或查看正则表达式(Python中的re
包),如果您不知道它有多少个零可能是。
答案 2 :(得分:1)
您可以使用内置函数any()
检查数字是否包含两个或更多个零,或三个或更多位数,例如:
if len(num) == 10:
if any((x in num) for x in [str(i) + str(i) + str(i) for i in range(1, 10)]):
print('invalid')
elif '00' in num:
print('invalid')
else:
print('valid')
else:
print('invalid')
如果提供的任何表达式为any()
,则 True
会返回True
。
答案 3 :(得分:0)
使用 regex
来检测其他条件的解决方案,正如@Riaz所建议的那样,应该肯定比我要建议的更好,但为了完整起见,也可以使用 itertools.groupby
执行以下操作,grouped_L
返回一个元组列表,其中包含一个数字,后跟连续重复项的数量(Reference):
from itertools import groupby
num = 1234567890 # Using input as an int
L = [int(x) for x in str(num)]
grouped_L = [(k, sum(1 for i in g)) for k,g in groupby(L)]
validity = True
if len(str(num)) == 10:
for i in grouped_L:
if (i[0]!=0 and i[1]>2):
validity = False
break
elif (i[0]==0 and i[1]>1):
validity = False
break
else:
validity = True
else:
validity = False
if validity:
print('valid')
else:
print('not valid')
答案 4 :(得分:0)
类似的东西:
>>> def check(num):
... l=[str(i)+str(i) for i in range(10)]
... l[0]='000'
... if len(num)!=10:
... return "not valid"
... else:
... for i in l:
... if i in num:
... return "not valid"
... return "valid"
...
>>> n="1234567890"
>>> check(n)
'valid'
>>> n="1234500090"
>>> check(n)
'not valid'
答案 5 :(得分:0)
如果我理解了这个问题("后面有两个或更多的零"表示"两个或多个连续的零"?),则该数字必须正好为10位数。它不能有两个(或更多)连续的零。它必须不具有除零之外的三个(或更多)连续数字。 (三个连续的零意味着两个连续的零,因此由于第二个规则确实构成无效数字 - 我们不需要从上一次测试中排除零。)
那就是代码
def validate(s):
# 10 characters
if len(s) != 10:
return False
# all digits
for c in s:
if not c.isdigit():
return False
# no two or more consecutive '0'
for a,b in zip(s[0:9],s[1:10]):
if a == b == '0':
return False
# no three or more consecutive digits
for a,b,c in zip(s[0:8],s[1:9],s[2:10]):
if (a == b == c) and a.isdigit():
return False
#
return True
TESTS = (
'12345678x0', # one character not digit
'123456789', # not 10 characters
'1234567890', # valid
'1230067890', # two consecutive zeroes
'1224567890', # valid
'1114567890', # three consecutive digits (other than zero)
)
for t in TESTS:
print( t, 'valid' if validate(t) else 'not valid' )
n = raw_input("Enter number: ")
print( n, 'valid' if validate(n) else 'not valid' )