<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<font face="monospace">Hola: 馃檪<br>
<br>
Estoy intentando de validar una duraci贸n (tiempo) introducido en
una caja de texto.<br>
Lo que trato de validar es una duraci贸n no una hora.<br>
Las duraciones tienen una precisi贸n de cent茅simas de segundo por
lo que la funci贸n devuelve las cent茅simas de la duraci贸n.<br>
<br>
El caso es que creo que me he complicado algo y seguro que se
puede hacer mejor.<br>
Es por aprender, porque la funci贸n tal como est谩 me funciona (o
eso creo).<br>
<br>
Para la validaci贸n se tienen en cuenta dos formas de introducir
las duraciones, una con puntuaci贸n y otra sin.<br>
Para la separaci贸n de decimales se puede introducir tanto coma
como punto.<br>
El tiempo m铆nimo son 10,00 (10 s).<br>
El tiempo m谩ximo son 23:59:59<br>
Con 芦tiempo禄 me estoy refiriendo a duraciones.<br>
<br>
Mis dudas preguntas son:<br>
Cre茅is que son demasiado laxos los formatos a introducir?<br>
Por ejemplo, no tengo claro si esto<br>
'1:6.44'<br>
ser铆a mejor NO validarlo?<br>
<br>
O las introducciones que acaban en 芦:禄 como por ejemplo:<br>
:16:<br>
16:<br>
las cuales actualmente tienen resultados v谩lidos.<br>
<br>
<br>
<br>
Saludos y gracias por la atenci贸n.<br>
<br>
<br>
duraciones.py<br>
<br>
# -*- coding: utf-8 -*-<br>
<br>
<br>
values = (<br>
聽聽聽 ':34',聽 # error<br>
聽聽聽 '000044',聽 # error<br>
聽聽聽 '000000',聽 # error<br>
聽聽聽 '106.44',聽 # error<br>
聽聽聽 '106.4',聽 # error<br>
聽聽聽 '1:06.44',聽 # 1:06,44<br>
聽聽聽 '1:6.44',聽 # 1:06,44<br>
聽聽聽 '1:6.4',聽 # 1:06,40<br>
聽聽聽 '16.44',聽 # 16,44<br>
聽聽聽 '16:44',聽 # 16,44<br>
聽聽聽 '16.4',聽 # 16,40<br>
聽聽聽 '16.',聽 # 16,00<br>
聽聽聽 ':16: ',聽 # 16,00<br>
聽聽聽 '16: ',聽 # 16:00.00<br>
聽聽聽 '.16: ',聽 # error por inferior a 10,00<br>
聽聽聽 '34.15',聽 # 34,15<br>
聽聽聽 '3415',聽 # 34,15<br>
聽聽聽 '1:30:44',聽 # 1:30:44,00<br>
聽聽聽 '13044',聽 # 1:30,44<br>
聽聽聽 '1:60.44',聽 # error<br>
聽聽聽 'A1b:6.44', # error<br>
聽聽聽 '00:00.44', # error por ser inferior a 10,00<br>
聽聽聽 '00:10.4', # 10,44<br>
聽聽聽 '59:00.44',聽 # 59:00,44<br>
聽聽聽 '0:59:00.44',聽 # 59:00,44<br>
聽聽聽 '23:59:59.99',聽 # 23:59:59,99<br>
聽聽聽 '10.00',聽 # 10,00<br>
聽聽聽 '12:34:15',聽 # 12:34:15,00<br>
聽聽聽 '123415',聽 # 12:34,15<br>
聽聽聽 '2:01:23.56',聽 # 2:01:23,56<br>
聽聽聽 '2012356',聽 # 2:01:23,56<br>
聽聽聽 '23:01:23.56',聽 # 23:01:23,56<br>
聽聽聽 '23:01:23:56',聽 # esto pasa a 23:01:23:56.00 por lo que da
error al pasar el valor m谩ximo 23:59:59.99<br>
聽聽聽 '25:01:23.56',聽 # error, el valor m谩ximo es 23:59:59,99<br>
聽聽聽 '25012356',聽 # error, el valor m谩ximo es 23:59:59,99<br>
聽聽聽 )<br>
<br>
<br>
<br>
<br>
def validate(value):<br>
聽聽聽 '''<br>
聽聽聽 value is a duration string<br>
聽聽聽 return hundredths integer<br>
聽聽聽 '''<br>
聽聽聽 hundredths = 0<br>
聽聽聽 tempo_formatado = ''<br>
聽聽聽 value = value.strip()<br>
聽聽聽 error = ''<br>
聽聽聽 partes = []<br>
聽聽聽 if value.isdigit():聽 # valida introducci贸n de marca s贸lo con
n煤meros<br>
聽聽聽聽聽聽聽 digits = value<br>
聽聽聽聽聽聽聽 len_digits = len(digits)<br>
聽聽聽聽聽聽聽 if len_digits == 4:<br>
聽聽聽聽聽聽聽聽聽聽聽 partes = [digits[-2:], digits[-4:-2]]<br>
聽聽聽聽聽聽聽 elif len_digits in (5, 6):<br>
聽聽聽聽聽聽聽聽聽聽聽 partes = [digits[-2:], digits[-4:-2], digits[-6:-4]]<br>
聽聽聽聽聽聽聽 elif len_digits in (7, 8):<br>
聽聽聽聽聽聽聽聽聽聽聽 partes = [digits[-2:], digits[-4:-2], digits[-6:-4],
digits[-8:-6]]<br>
聽聽聽聽聽聽聽 else:<br>
聽聽聽聽聽聽聽聽聽聽聽 partes = []<br>
聽聽聽聽聽聽聽聽聽聽聽 error = 'Exceeded the maximum number of digits.'<br>
聽聽聽 else:聽 # valida introducci贸n de marca con puntuaci贸n<br>
聽聽聽聽聽聽聽 # busca a 煤ltima puntuaci贸n e separa<br>
聽聽聽聽聽聽聽 for pos in range((len(value)-1), -1, -1):<br>
聽聽聽聽聽聽聽聽聽聽聽 if value[pos] in ('.',','):<br>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 partes = value.split(value[pos])<br>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 # repair void<br>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 for x, i in enumerate(partes):<br>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 if not i:<br>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 partes[x] = '00'<br>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 if len(partes) > 2:<br>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 error = 'value mal formed'<br>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 partes = []<br>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 else:<br>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 partes = partes[0].split(":") + [partes[1], ]<br>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 break<br>
聽聽聽聽聽聽聽聽聽聽聽 elif value[pos] == ':':<br>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 partes = value.split(":")<br>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 # repair void聽聽 <br>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 for x, i in enumerate(partes):<br>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 if not i:<br>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 partes[x] = '00'<br>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 partes.append('00')<br>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 break<br>
聽聽聽聽聽聽聽 if len(partes) in (2, 3, 4):<br>
聽聽聽聽聽聽聽聽聽聽聽 partes = partes[::-1]聽 # reverse<br>
聽聽聽聽聽聽聽聽聽聽聽 for x, i in enumerate(partes):<br>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 if i.isdigit():<br>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 if len(i) == 1:<br>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 if x == 0:<br>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 partes[x] = '%s0' % i<br>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 else:<br>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 partes[x] = '0%s' % i<br>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 else:<br>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 partes = []<br>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 error = 'ilegal characters'<br>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 break<br>
聽聽聽聽聽聽聽 else:<br>
聽聽聽聽聽聽聽聽聽聽聽 error = 'value mal formed'<br>
聽聽聽聽聽聽聽聽聽聽聽 partes = []<br>
聽聽聽 while len(partes) > 1 and int(partes[-1]) == 0:<br>
聽聽聽聽聽聽聽 partes.pop()<br>
聽聽 <br>
聽聽聽 if len(partes) in (2, 3, 4):<br>
聽聽聽聽聽聽聽 # check partes ranges<br>
聽聽聽聽聽聽聽 for x, i in enumerate(partes):<br>
聽聽聽聽聽聽聽聽聽聽聽 if x == 0:<br>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 if int(i) > 99:<br>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 error = 'value out range'<br>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 break<br>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 else:<br>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 hundredths += int(i)<br>
聽聽聽聽聽聽聽聽聽聽聽 elif x == 1:<br>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 if int(i) > 59:<br>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 error = 'value out range'<br>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 hundredths = 0<br>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 break<br>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 else:<br>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 hundredths += int(i) * 100<br>
聽聽聽聽聽聽聽聽聽聽聽 elif x == 2:<br>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 if int(i) > 59:<br>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 error = 'value out range'<br>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 hundredths = 0<br>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 break<br>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 else:<br>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 hundredths += int(i) * 6000<br>
聽聽聽聽聽聽聽聽聽聽聽 elif x == 3:<br>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 if int(i) > 23:<br>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 error = 'value out range'<br>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 hundredths = 0<br>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 break<br>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 else:<br>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 hundredths += int(i) * 360000<br>
聽聽聽聽聽聽聽 if hundredths:<br>
聽聽聽聽聽聽聽聽聽聽聽 tempo_formatado = partes[::-1]<br>
聽聽聽聽聽聽聽聽聽聽聽 tempo_formatado[0] = str(int(tempo_formatado[0]))聽 #
quita o cero incial<br>
聽聽聽聽聽聽聽聽聽聽聽 tempo_formatado = ':'.join(tempo_formatado)<br>
聽聽聽聽聽聽聽聽聽聽聽 tempo_formatado = tempo_formatado[::-1].replace(':',
',', 1)[::-1]<br>
聽聽聽聽聽聽聽聽聽聽 <br>
聽聽聽 print('{} -> {} -> {}聽 {}'.format(value,
tempo_formatado, hundredths, error))<br>
聽聽聽 return hundredths<br>
<br>
for value in values:<br>
聽聽聽 validate(value)<br>
<br>
<br>
-- <br>
Dani</font><br>
</body>
</html>