Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

tester si un la saisie d'un champde formulaire est bien un nombre

7 réponses
Avatar
Cornelius
Salut,

sir dans un champ input texte, l'utilisateur saisit 1a,2 ou 1aacd,3e par
exemple, les fonction de conversion arrive à convertir ça en float ou
integer et ce n'est pas ce que je veux, pour tester si le champ est bien
numérique (montant à saisir dans une BDD).

if((float)$_POST["mon_champ"])
echo "c'est un float !";

Et donc ça passe.

is_numeric ne reconnait pas 1,2 mais que 1.2 (reconnait pas la virgule),
gênant....

ya pas une méthode ardicalemnt efficace ?
(Surtout que je ne suis certainement ps le seul a avoir été confronté à ce
problème)

Merci d'avance

7 réponses

Avatar
P'tit Marcel
Cornelius écrivit:

sir dans un champ input texte, l'utilisateur saisit 1a,2 ou 1aacd,3e
par exemple, les fonction de conversion arrive à convertir ça en float
ou integer


php convertira tout ça en 1 ce qui n'est sans doute pas le résultat
attendu...


if((float)$_POST["mon_champ"])
echo "c'est un float !";


non


is_numeric ne reconnait pas 1,2 mais que 1.2 (reconnait pas la
virgule), gênant....


si tu veux reconnaître la virgule comme synonyme du point décimal, rien ne
t'empêche de faire

$nombre=strtr($nombre, ',' , '.');
if(is_numeric($nombre)) ...

mais bon, il faudra pas tomber sur un comptable anglo-saxon employant la
virgule comme séparateur des milliers...

--
P'tit Marcel

Avatar
Cornelius
"P'tit Marcel" a écrit dans le
message de news: >
$nombre=strtr($nombre, ',' , '.');
if(is_numeric($nombre)) ...



Merci ç'est ce que j'ai finalement retenu.
Niveau vitesse, enter ereg_replace et strtr ?? Ce sont des alias ?

mais bon, il faudra pas tomber sur un comptable anglo-saxon employant la
virgule comme séparateur des milliers...



temps pis pour lui !!
Ces des nenettes des ventes qui seront sensées remplir ces champs (réponses
à demandes de prix)

--
P'tit Marcel


Avatar
P'tit Marcel
Guillaume Bouchard écrivit:

Non, strtr et ereg n'ont pas du tout le meme fonctionement et strtr sera
je pense plus rapide.


oui (pas d'appel à la bib POSIX).


Bien que dans le cas de figure j'utiliserais plutot str_replace.


strtr est juste conçu pour remplacer caractère par caractère. str_replace
lui doit avoir en plus des routines de déplacement de chaîne (quand on
remplace un caractère par 10 il faut pousser le reste de la chaîne) donc
tc=pa il devrait être moins adapté. Mais bon là je pinaille ;-)


--
P'tit Marcel
statistiques sur les forums modérés : http://www.centrale-lyon.org/ng/

Avatar
Cornelius
"Guillaume Bouchard" a écrit dans le message de news:
3f32d575$0$9591$
Niveau vitesse, enter ereg_replace et strtr ?? Ce sont des alias ?


Non, strtr et ereg n'ont pas du tout le meme fonctionement et strtr sera
je pense plus rapide. Bien que dans le cas de figure j'utiliserais
plutot str_replace.

--
Guillaume.


Extrait de la doc PHP (commenataire d'un user pour str_replace)
"on 25-Feb-2003 12:31, igjav at cesga dot es wrote:"So am I wrong if I say
that str_replace doesn't makes sense,..."

yes, you are. the difference between both functions ist the speed of
execution. if you want to replace only single characters, it is faster to
use strtr(). but if you want to replace bigger parts of a string, you'd
better use str_replace. it is much, much faster in this case."


Avatar
Cornelius
"Guillaume Bouchard" a écrit dans le message de news:
3f337112$0$6218$

yes, you are. the difference between both functions ist the speed of
execution. if you want to replace only single characters, it is faster
to


use strtr(). but if you want to replace bigger parts of a string, you'd
better use str_replace. it is much, much faster in this case."


Oki... cela ne me semble pas logique, mais bon, des mysteres se cachent
dans les entrailles de php :)



Ce qu'a dit P'tit Marcel est logique: remplacer un cararctère amène a
changer le contenu d'un pointeur (en parlant C). Alors que remplacer une
chaine par une chaine, c'est beaucoup plus de traitement (découpage,
décalalge, copies/recopie en mémoires, etc...)


Avatar
Matchenul
"Cornelius" a écrit dans le message de news:
3f322929$0$16163$
Salut,
ya pas une méthode ardicalemnt efficace ?
sisi, le javascript :

<html>
<head><title>Entree numerique</title>
<script>

function carClavier(e){
if (window.event)
return String.fromCharCode(window.event.keyCode); //pour I.E
else
return String.fromCharCode(e.which); //pour Netscape
}

function testNum(e){
caractereÊrClavier(e);
if (caractere < "0" || caractere > "9")return false; else return true;
}

</script>
</head>
<body>

<form>
<!--Ce champ n'accepte que des valeurs num&eacute;riques :-->
<input onKeyPress="return testNum(event)">
</form>
</body>
</html>

ya pas mieux : on se prend pas la tête comme vous l'avez fait avec ereg ou
pas ereg et c'est executé côté client, donc plus rapide.
Tiré de l'exxelllent livre "les cahiers du programmeur 2" de Ph Chaléat et D
Charnay aux editions eyrolles.

Avatar
Cornelius
"Matchenul" a écrit dans le message de news:
3f33db09$0$26405$
<form>
<!--Ce champ n'accepte que des valeurs num&eacute;riques :-->
<input onKeyPress="return testNum(event)">
</form>
</body>
</html>

ya pas mieux : on se prend pas la tête comme vous l'avez fait avec ereg
ou

pas ereg et c'est executé côté client, donc plus rapide.
Tiré de l'exxelllent livre "les cahiers du programmeur 2" de Ph Chaléat et
D

Charnay aux editions eyrolles.


Merci, j'allais justement rajouter et chercher du code javasscript pour
faire travailler le client, mais bon la solution d'avant est incontournable:
Je ne peux pas me permettre d'accepter une données d'un "client" pour mettre
dans une BDD de production.