Este último también tiene sus cosas, por ejemplo si se indica milisegundos pero no hay (por ejemplo
_SecToHMS(3000,1) ) la cadena de los milisegundos está vacía, creo que debería ser
0 en el valor numérico, y en la cadena o es cero o se quitan los tres "
:".
Además de que no pones valores numéricos (son cadenas) en los elementos por separado, como creo que era la idea...
Por cierto, si por ejemplo pongo
_SecToHMS(3599,0) en
$S_Time[4] me sale que hay 99 milisegundos, cuando deberían ser cero...
Una cosa, yo trabajaría numéricamente con las divisiones, los Int y los Mod para los valores por separado en $S_Time[1] a $S_Time[4], y al final para calcular $S_Time[0] lo juntaría todo con un StringFormat (o dos, dependiendo de si hay que poner milisegundos o no), por ejemplo sin milisegundos:
Código: Seleccionar todo
$hora = 5
$min = 10
$seg = 3
$cadena = StringFormat("%02u:%02u:%02u", $hora, $min, $seg)
Pues sí que se está resistiendo este programilla. Yo me pongo a sacar lo de los decimales sin pasar por strings, por intentar hacerlo más rápido, y se me ocurre esto:
Código: Seleccionar todo
$num = 34.23
$entera = Int($num)
$decimal = $num - $entera
Ojo que no está acabado, falta escalar decimal para que se haga entero. Pero no he llegado a eso, ese ejemplo me da:
num = 34
decimal = ¡¡0.229999999999997!!
Los típicos problemas de almacenar números decimales en binario...
Así que quizás no haya más remedio que usar strings
Una sugerencia para afinar
Cuando el parámetro es en segundos ¿por qué no permitir decimales? El resultado entonces tiene milisegundos, aunque el parámetro se dé en segundos:
500.23 segundos = 8 minutos + 20 segundos + 230 milisegundos
Esta función la hice en otro lenguaje, estas son mis fórmulas para calcular los valores numéricos independientes (traducidas a AutoIt). No hace falta calcular valores intermedios ni tienen dependencias, cada valor se calcula desde el parámetro original (yo no usaba milisegundos, habría que sacar primero los decimales):
Código: Seleccionar todo
$tiempo = 500 ;los segundos a procesar
$hora = Floor($tiempo / 3600) ;División entera
$min = Mod(Floor($tiempo / 60), 60)
$seg = Mod($tiempo, 60)
ConsoleWrite(StringFormat("%02u:%02u:%02u", $hora, $min, $seg) & @CRLF)
Como estamos trabajando con valores positivos
Floor e
Int son equivalentes.