OVH Cloud OVH Cloud

simplifier une validation de digit ?

12 réponses
Avatar
Gill
De combien de caractères pourriez-vous réduire mon horreur ici-présente ?
- $page est un string/numéro de 2 chiffres (pas de virgule ni de signe)
- $page <= $dernierepage
- si $page non valide, $page="00"

if($page==NULL)
$page="00";
if(strlen($page) < 3){
if(strlen($page) == 1 && strstr("0123456789",$page))
$page = "0".$page;
if(!(strstr("0123456789",$page{0}) && strstr("0123456789",$page{1})))
$page = "00";
} else $page = "00";
if((int)$page > (int)$dernierePage)
$page="00";

10 réponses

1 2
Avatar
ftc
De combien de caractères pourriez-vous réduire mon horreur ici-présente ?
- $page est un string/numéro de 2 chiffres (pas de virgule ni de signe)
- $page <= $dernierepage
- si $page non valide, $page="00"

if($page==NULL)
$page="00";
if(strlen($page) < 3){
if(strlen($page) == 1 && strstr("0123456789",$page))
$page = "0".$page;
if(!(strstr("0123456789",$page{0}) && strstr("0123456789",$page{1})))
$page = "00";
} else $page = "00";
if((int)$page > (int)$dernierePage)
$page="00";



if( $page && ctype_digit( $page ) && strlen( $page ) < 3 &&
(int)$page<(int)$dernierePage) {
$page = sprintf( "%02d", $page);
}
else {
$page = "00";
}

ou bien:

if ( preg_match( '/([0-9]){1,2}/', $page ) &&
(int)$page<(int)$dernierePage ) {
$page = sprintf( "%02d", $page);
}
else {
$page = "00";
}

Avatar
dmetzler
Pour répondre à ta question, je vais essayer de reformaliser ton
problème. Tu as une variable de type chaine de caractère qui à
priori représente un nombre.

1°/ Tu veux vérifier que la variable est déclarée et le format de
cette chaine (2 chiffres)

2°/ Tu veux faire en sorte que si le nombre est supérieur à
dernière page, il faut le mettre à 0

3°/ Ensuite tu veux reformater le nombre pour l'afficher sur deux
digits.

Voici ce que ça donne avec la boucle de test:

<?php

function formatPage($page,$dernierepage) {
if (isset($page) && ereg("[0-9]{1,2}",$page)) {
$page = ($page > $dernierepage ? 0: $page);
} else $page=0;
return sprintf("%02d",$page);
}

for($i=0;$i<7; $i++) {
echo "Page $i : ".formatPage(sprintf("%02d",$i),5)."n";
}

?>

Il y a peut être plus simple (notament pour ne pas utiliser
l'expression régulière) mais au moins on comprends mieux.
Avatar
bruno modulix
Gill wrote:
De combien de caractères pourriez-vous réduire mon horreur ici-présente ?
de 160. Précisément.


- $page est un string/numéro de 2 chiffres (pas de virgule ni de signe)
- $page <= $dernierepage
- si $page non valide, $page="00"

if($page==NULL)
$page="00";
if(strlen($page) < 3){
if(strlen($page) == 1 && strstr("0123456789",$page))
$page = "0".$page;
if(!(strstr("0123456789",$page{0}) && strstr("0123456789",$page{1})))
$page = "00";
} else $page = "00";
if((int)$page > (int)$dernierePage)
$page="00";


$p=$page;$dp=(int)dernierePage;
$page=ctype_digit($p)?(int)$p:0;$p=($p>$dp||$p>99?0:$p);$p=($p<10?"0$p":"$p");
108 caractères, au lieu de 268.

Pardon ? Hein ? Tu voudrais que ce soit lisible, en plus ? Ah bin
désolé, on peut pas tout avoir !-)


Bon, allez:

if (ctype_digit($page)) {
$page = (int)$page;
if ($page > 99 || $page > (int)$dernierePage) {
$page = 0;
}
}
else {
$page = 0;
}
$page = sprintf("%02d", $page);

HTH
--
bruno desthuilliers
ruby -e "print ''.split('@').collect{|p|
p.split('.').collect{|w| w.reverse}.join('.')}.join('@')"

Avatar
bruno
if(strlen($page) < 3){
if (!ereg([0-9], $page{1}) ) :
$page{1} = "0";
}
if (!ereg([0-9], $page{2}) ) :
$page[2] = "0";
}
} else {$page = "00";}

un truc dans le genre, non?

tout du moins :

ereg([0-9]), c'est moins le bordel...
Avatar
Bruno Baguette
De combien de caractères pourriez-vous réduire mon horreur ici-présente ?
- $page est un string/numéro de 2 chiffres (pas de virgule ni de signe)
- $page <= $dernierepage
- si $page non valide, $page="00"


A vue de nez, je dirais :

if(strlen(trim($page))==2 && ctype_digit(trim($page))===TRUE && $page <=
$dernierepage)
{
// OK
}
else
{
// Y a un stuut
// ==> Page par défaut
$page="00";
}

Si tu ne dois rien mettre quand la condition est juste, alors il faudra
peut-être voir à inverser pour ne pas mettre un else.

En espérant que ca aide ! :-)

--
Bruno BAGUETTE -

Avatar
Gill
if ( preg_match( '/([0-9]){1,2}/', $page ) &&
(int)$page<(int)$dernierePage ) {
$page = sprintf( "%02d", $page);
}
else {
$page = "00";
}


Autre post :

function formatPage($page,$dernierepage) {
if (isset($page) && ereg("[0-9]{1,2}",$page)) {
$page = ($page > $dernierepage ? 0: $page);
} else $page=0;
return sprintf("%02d",$page);
}


C'est effectivement bien plus concis et mieux construit que moi...
J'avais oublié l'intérêt du sprintf !!!
Quant à ereg et preg_match, je vais sérieusement me pencher dessus.
Merci beaucoup !! :-)

Avatar
Gill
if(strlen($page) < 3){
if (!ereg([0-9], $page{1}) ) :
$page{1} = "0";
}
if (!ereg([0-9], $page{2}) ) :
$page[2] = "0";
}
} else {$page = "00";}


Je suis confondu par l'extrême diversité des solutions présentées !!!
J'ai un petit faible pour la lisibilité de celle-ci ;-)
Mais peut-être que les autres sont plus puissantes...

Merci à tous : vous venez de me redonner envie de jouer aux jeux de logique
booléenne, au lieu de me contenter de produire une application !
(Mouiche : encore beaucoup de travail pour améliorer ma façon de concevoir
les algorythmes et ma culture en PHP...)

Avatar
bruno
he ho! je suis stagiaire qui debiug moi!
alors prend po mon algo, il doit etre bourré de faute!!!
<troll>
:)
</troll>

ps : ca veut dire quoi troll?
Avatar
Gill
if(strlen($page) < 3){
if (!ereg([0-9], $page{1}) ) {
$page{1} = "0";
}
if (!ereg([0-9], $page{2}) ) {
$page{2} = "0";
}
} else {$page = "00";}
Notice: Uninitialized string offset: 2 in index.php on line 22

string(3) "010"

if(strlen($page)< 3){
if (!ereg("[0-9]", $page{0})){
$page{0} = "0";
}
if (!ereg("[0-9]", $page{1})){
$page{1} = "0";
}
} else {$page = "00";}
if((int)$page > (int)$dernierePage){
$page="00";
}

Voilà : ça me semble lisible... et corrigé !
(merci pour la leçon : les erreurs, c'est formateur ;-)

Avatar
Gill
alors prend po mon algo, il doit etre bourré de faute!!!
Zut ! En effet, il y en a encore une :

il faudrait rajouter un sprintf("%02d",$page); à la 2ème ligne, sinon, en
cas de "1 caractère", PHP n'est pas content ("Tu essaies de modifier le
caractère qui suit le dernier !").
D'où l'intérêt du ereg("[0-9]{1,2}",$page)) proposé par ailleurs ;-)

En fait, je voulais éviter d'utiliser tel quel un algo tout finit,
travailler un peu de mon coté, quoi ! Histoire de pas trop jouer au
profiteur de bonnes âmes ;-) !

if(strlen($page)< 3){
sprintf("%02d",$page);
if (!ereg("[0-9]", $page{0})){
$page{0} = "0";
}
if (!ereg("[0-9]", $page{1})){
$page{1} = "0";
}
} else {$page = "00";}
if((int)$page > (int)$dernierePage){
$page="00";
}

Pfff... Du coup, ça fait long et pas tellement plus sûr que les autres
propositions...

1 2