I-NOZex Posted March 10, 2014 at 01:13 PM Report #548063 Posted March 10, 2014 at 01:13 PM Boas, tenho a seguinte função para transformar uma string, num formato MYSQL TIME correcto (HH:MM:SS) o que venho aqui perguntar é uma forma de fazer melhor possivelmente, pois embora funcione, acho que fiz de forma um pouco arbitrária aqui fica a função: public function parseLength($length){ $length = preg_replace("/^([\d]{1,2})\[\d]{2})$/", "00:$1:$2", $length); sscanf($length, "%d:%d:%d"); return date('H:i:s',strtotime($length)); } o que preciso é que pegue em strings num destes possiveis formatos: 01:23:45 00:12:34 12:34 2:34 e que converta no HH:MM:SS correspondente: 01:23:45 00:12:34 00:12:34 00:02:34 e já agora, qual a melhor maneira de fazer "trim" aos 00 inutilizados? digo, imaginando que temos a string 00:02:34, mostrar apenas 02:34 obrigado, isto sao coisas que já fiz, mas quero reavaliar se existe uma melhor forma, obrigado 🙂 B2R » Beat2Revolution v3.0b | Regista e divulga-nos beat2revolution.net
HappyHippyHippo Posted March 10, 2014 at 01:27 PM Report #548065 Posted March 10, 2014 at 01:27 PM (edited) uma solução : <?php echo "<pre>"; $values = array('01:23:45', '00:12:34', '12:34', '2:34'); array_walk($values, function(&$item) { $item = strpos($item, ':') == strrpos($item, ':') ? date("H:i:s", strtotime('00:'.$item)) : date("H:i:s", strtotime($item)); }); print_r($values); array_walk($values, function(&$item) { while (strpos($item, '00:') === 0) $item = substr($item, 3); }); print_r($values); echo "</pre>"; ?> Edited March 10, 2014 at 01:36 PM by HappyHippyHippo 1 Report IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
bioshock Posted March 10, 2014 at 02:48 PM Report #548073 Posted March 10, 2014 at 02:48 PM Creio que funciona como pretendes. $time = '2:34'; list($h, $m, $s) = (strlen($time) != 8 ? explode(':', '00:' . $time) : explode(':', $time)); echo gmdate('H:i:s', ($h * 3600) + ($m * 60) + $s);
HappyHippyHippo Posted March 10, 2014 at 03:02 PM Report #548076 Posted March 10, 2014 at 03:02 PM Creio que funciona como pretendes. $time = '2:34'; list($h, $m, $s) = (strlen($time) != 8 ? explode(':', '00:' . $time) : explode(':', $time)); echo gmdate('H:i:s', ($h * 3600) + ($m * 60) + $s); sim, funciona para todos os formatos apresentados pelo I-NOZex (também conhecido como antigo CTRF agora Unsigned User ...) mas existe um caso particular que não sei se é para ter em conta: $time = '1:23:45' 1 Report IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
bioshock Posted March 10, 2014 at 03:21 PM Report #548079 Posted March 10, 2014 at 03:21 PM Bem, leva mais uma condição lá pó meio..mas se calhar já começa a ficar um pouco confuso..e talvez já não se seja tão good-looking. 😁 list($h, $m, $s) = (strlen($time) != 8 ? (strlen($time) == 7 ? explode(':', '0' . $time) : explode(':', '00:' . $time)) : explode(':', $time)); 1 Report
HappyHippyHippo Posted March 10, 2014 at 03:26 PM Report #548081 Posted March 10, 2014 at 03:26 PM (edited) sabes com comparações com strlen eu poderia andar aqui a fazer notas para valores tipo >> 1:2:3 ... Edited March 10, 2014 at 03:26 PM by HappyHippyHippo IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
bioshock Posted March 10, 2014 at 03:32 PM Report #548084 Posted March 10, 2014 at 03:32 PM Se esses tipos de input ('1:1:1') forem válidos, então o meu código anula-se.
HappyHippyHippo Posted March 10, 2014 at 03:38 PM Report #548086 Posted March 10, 2014 at 03:38 PM (edited) Se esses tipos de input ('1:1:1') forem válidos, então o meu código anula-se. como disse acima ... não sei se é válido ou não ... ps : se é para um 1-liner: echo "<pre>"; $values = array('01:23:45', '1:23:45', '1:2:3', '00:12:34', '12:34', '2:34', '34'); array_walk($values, function(&$item) { $item = date('H:i:s', strtotime(str_repeat('0:', 2 - substr_count($item, ':')).$item)); }); print_r($values); echo "</pre>"; resultado Array ( [0] => 01:23:45 [1] => 01:23:45 [2] => 01:02:03 [3] => 00:12:34 [4] => 00:12:34 [5] => 00:02:34 [6] => 00:00:34 ) Edited March 10, 2014 at 03:57 PM by HappyHippyHippo IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
bioshock Posted March 10, 2014 at 03:54 PM Report #548092 Posted March 10, 2014 at 03:54 PM Esse tipo de input duvido que seja válido..mas o '1:23:45' vai de encontro ao problema.
I-NOZex Posted March 10, 2014 at 05:03 PM Author Report #548100 Posted March 10, 2014 at 05:03 PM (edited) I-NOZex (também conhecido como antigo CTRF agora Unsigned User ...) CLRF amico 😁 peço desculpa pela demora sim, esqueci-me de referir uma entrada do genero 1:23:19 é considerada válida e deve ser convertida para o formato correto já 1:2:3 cria demasiada redundancia de dados, pelo que tenho ideias de nao tornar valida resumindo, o 1º zero da entrada pode ser ignorado: 34 = 34 segundos; 2:10 (2minutos e 10seg); 1:02:34 (1h,2min,34seg) esse teu ultimo codigo é o que recomendas entao happyhippo? e quanto a "anulaçao" dos leading zeros recomendas a segunda parte do codigo da tua primeira resposta? anyway, obrigado a ambos, happy e bioshock pelas vossas opinioes 😄 entretanto precisava de ajuda com outra coisa, agora ja nao é tao php, mas ainda é a questao das formatações como fazer mask a um input field, de modo a puder inserir-se 9.99 ou 99.99 ou 999.99 (é um campo para inserir um tamanho em MB) ou seja, pode ser 1.05 (mb), 11.7, 234.56... tinha grande preferencia que fosse usa solução com base neste plugin http://digitalbush.com/projects/masked-input-plugin/ obrigado desde ja 🙂 Edited March 10, 2014 at 05:11 PM by I-NOZex B2R » Beat2Revolution v3.0b | Regista e divulga-nos beat2revolution.net
bioshock Posted March 10, 2014 at 05:18 PM Report #548103 Posted March 10, 2014 at 05:18 PM É um bocado desnecessário a utilização de um plugin para obteres o que pretendes. Com regex fazes bem isso. ^[0-9]+(\.)?[0-9]{0,2}$ E se precisares de vírgulas ^[0-9]+(\.|,)?[0-9]{0,2}$ Mas pelo que estive a ler, acho que o plugin te permite ter regex. http://stackoverflow.com/questions/17995998/masked-input-plugin-and-regular-expressions-for-decimal-numbers http://stackoverflow.com/questions/4787763/allowing-dash-with-jquery-masked-input-plugin http://stackoverflow.com/questions/9667836/jquerys-maskedinput
HappyHippyHippo Posted March 10, 2014 at 05:23 PM Report #548105 Posted March 10, 2014 at 05:23 PM esse teu ultimo codigo é o que recomendas entao happyhippo? sim, como podes ver o resultado dos testes, passou a tudo ... e quanto a "anulaçao" dos leading zeros recomendas a segunda parte do codigo da tua primeira resposta? sim, é a mais simples tinha grande preferencia que fosse usa solução com base neste plugin http://digitalbush.com/projects/masked-input-plugin/ obrigado desde ja 🙂 só testando ... nunca usei esse plugin IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
I-NOZex Posted March 10, 2014 at 05:33 PM Author Report #548106 Posted March 10, 2014 at 05:33 PM (edited) thanks @happyhippyhippo @bishock a framework (YII) tem um maskedinput baseado nesse plugin, dai a minha preferencia é que eu queria por um lado facilitar a inserção dos dados para o utilizador, e por outro, facilitar a validação o "problema" desse plugin, é que eu penso que ele nao permite ter apenas uma parte opcional, tudo que esteja á direita do ? passa a opcional ou seja, se um meter uma mask ?999.99 vai ser tudo opcional, eu so queria que o 1º caracter fosse opcional... Edited March 10, 2014 at 05:36 PM by I-NOZex B2R » Beat2Revolution v3.0b | Regista e divulga-nos beat2revolution.net
bioshock Posted March 10, 2014 at 05:47 PM Report #548109 Posted March 10, 2014 at 05:47 PM Pá, não conheço o plugin. Só te posso ajudar em termos de regex. O ideal será criares um novo tópico a pedires um regex específico..pelos vistos esse plugin dá para colocar regex.
I-NOZex Posted March 10, 2014 at 07:18 PM Author Report #548115 Posted March 10, 2014 at 07:18 PM boas, deixo aqui o topico, como já tas a par do problema penso que dei as infos essenciais, se precisares de mais depois diz https://www.portugal-a-programar.pt/topic/65327-regex-para-criar-mask-input-de-numeros-decimais/ B2R » Beat2Revolution v3.0b | Regista e divulga-nos beat2revolution.net
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now