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

conversion string->decimal

40 réponses
Avatar
Olivier Berquin
Bonjour tout le monde,

C'est ma première intervention ici.
J'ai recherché dans les anciens messages et n'ait pas trouvé de
solution...

J'ai un formulaire dans lequel l'utilisateur doit encoder un montant
(decimal).
Mon input est au format texte.
Comment puis-je être certain d'avoir un type decimal?

j'ai fait ceci, mais ça me paraît un peu tiré par les cheveux:
$val1 = $montant + 0.001;
$val2 = $val1 - 0.001;
if ($val2 == 0)
{
// Ce n'est pas un nombre...
}

Merci.

Oli.

10 réponses

1 2 3 4
Avatar
CrazyCat
Olivier Berquin wrote:
J'ai un formulaire dans lequel l'utilisateur doit encoder un montant
(decimal).
Mon input est au format texte.
Comment puis-je être certain d'avoir un type decimal?


is_float($montant) peut surement t'aider.

--
Réseau IRC Francophone: http://www.zeolia.net
Aide et astuces webmasters : http://www.c-p-f.org
Communauté Francophone sur les Eggdrops: http://www.eggdrop.fr

Avatar
Olivier Miakinen
Bonjour,


J'ai un formulaire dans lequel l'utilisateur doit encoder un montant
(decimal).
Mon input est au format texte.
Comment puis-je être certain d'avoir un type decimal?

j'ai fait ceci, mais ça me paraît un peu tiré par les cheveux:
$val1 = $montant + 0.001;
$val2 = $val1 - 0.001;
if ($val2 == 0)
{
// Ce n'est pas un nombre...
}


Tu as la fonction is_numeric() :
http://fr2.php.net/manual/fr/function.is-numeric.php

Mais j'ai l'impression que ça ne te conviendra pas, car d'après ton code
tu sembles supposer que 0 n'est pas un montant décimal acceptable, même
s'il est écrit sous la forme « 0.000 ».

Tu peux aussi ragarder du côté des expressions rationnelles, par exemple
un truc du genre '/^[0-9]+.[0-9]+$/' mais là encore il faudrait d'abord
que tu définisses précisément ce que tu veux accepter et ce que tu veux
rejeter.

Avatar
Paul
Bonjour tout le monde,
...

Mon input est au format texte.
Comment puis-je être certain d'avoir un type decimal?
RTFM :

http://www.php.net/manual/fr/function.is-numeric.php

Avatar
Guillaume Grason
Comment puis-je être certain d'avoir un type decimal?


Bonjour,
Vous pouvez faire une vérification avec is_numeric
- http://fr.php.net/is_numeric

La fonction intval est aussi intéressante pour traiter directement des
entiers en zappant la vérification (si ce n'est pas un nombre alors le
retour de intval sera de 0)
- http://fr.php.net/intval

Cordialement,
--
Guillaume Grason

Avatar
Thomas Mlynarczyk
Olivier Berquin schrieb:

J'ai un formulaire dans lequel l'utilisateur doit encoder un montant
(decimal).
Mon input est au format texte.
Comment puis-je être certain d'avoir un type decimal?


$montant
= is_numeric( $montant )
? (float) $montant
: 0.0;

--
Ce n'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!
(Coluche)

Avatar
Olivier Berquin
Attention, ma donnée $montant vient d'un formulaire.
Je ne peut donc pas utiliser les is_numéric, gettype et autres.
Ma donnée est du type "string".
Par contre, sur <http://www.php.net/manual/fr/function.is-
numeric.php>, j'ai vu une fonction qui utilise les expressions
régulière...
La voici:
<?
function my_is_numeric($value) {
$american = preg_match ("/^(-){0,1}([0-9]+)(,[0-9][0-9][0-9])*([.]
[0-9]){0,1}([0-9]*)$/" ,$value) == 1;
$world = preg_match ("/^(-){0,1}([0-9]+)(.[0-9][0-9][0-9])*([,]
[0-9]){0,1}([0-9]*)$/" ,$value) == 1;
return ($american or $world);
}
?>

-the English/American way of writing a float million number:
1,000,000.00
-the global way of writing a float million number: 1.000.000,02

Merci de m'avoir montrer la voie.

Oli.
Avatar
P'tit Marcel
Attention, ma donnée $montant vient d'un formulaire.
Je ne peut donc pas utiliser les is_numéric, gettype et autres.
Ma donnée est du type "string".


Essaye et tu verras que c'est pourtant tout à fait possible car php
n'est pas un langage typé. La limitation est que les nombres décimaux
doivent utiliser un point décimal et non une virgule.


Par contre, sur <http://www.php.net/manual/fr/function.is-
numeric.php>, j'ai vu une fonction qui utilise les expressions
régulière...
function my_is_numeric($value) {
$american = preg_match ("/^(-){0,1}([0-9]+)(,[0-9][0-9][0-9])*([.]
[0-9]){0,1}([0-9]*)$/" ,$value) == 1;
$world = preg_match ("/^(-){0,1}([0-9]+)(.[0-9][0-9][0-9])*([,]
[0-9]){0,1}([0-9]*)$/" ,$value) == 1;
return ($american or $world);
}


Oui, cela règle le problème de la virgule décimale. Cela dit,
l'instruction peut être simplifiée/améliorée comme suit :

$world = preg_match('/^-?[0-9]+([.s][0-9]{3})*(,[0-9]+)?$/' ,$value);

nota bene:
1/ le signe ? est une abréviation de {0,1}
2/ les groupes de 1000 sont ici séparables avec un espace (le s) ou un
point, voire n'être pas séparés
3/ il vaut mieux mettre les masques entre simple quote (le ')
4/ le "== 1" à la fin est inutile


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

Avatar
Olivier Berquin
Je vais bidouiller une expression régulière.
J'ai aussi testé l'exemple de Thomas, mais c'est un peu trop rigide:
n'accepte ni les espaces ni les virgules comme séparateur de millier.

Merci, donc, à tous.

Oli.
Avatar
Olivier Miakinen
Attention, ma donnée $montant vient d'un formulaire.
Je ne peut donc pas utiliser les is_numéric, gettype et autres.
Ma donnée est du type "string".


Justement, il n'y a pas de problème pour ça avec is_numeric (sans
accent) : <http://fr2.php.net/manual/fr/function.is-numeric.php>.

<cit.>
bool is_numeric (mixed $var)
... Les chaînes numériques ...
Retourne TRUE si var est un nombre ou *une chaîne numérique*
</cit.>

Par contre, sur <http://www.php.net/manual/fr/function.is-
numeric.php>, j'ai vu une fonction qui utilise les expressions
régulière...


Et tu penses qu'elle fait ce que tu veux qu'elle fasse ? Sais-tu au
moins ce qu'elle teste ?

La voici:
<?
function my_is_numeric($value) {
$american = preg_match ("/^(-){0,1}([0-9]+)(,[0-9][0-9][0-9])*([.]
[0-9]){0,1}([0-9]*)$/" ,$value) == 1;


Cette expression est équivalente à la suivante :
/^-?[0-9]+(,[0-9][0-9][0-9])*([.][0-9])?[0-9]*$/

Elle acceptera donc « -00000,000,001 » mais pas « 1. » ni « .01 ».

$world = preg_match ("/^(-){0,1}([0-9]+)(.[0-9][0-9][0-9])*([,]
[0-9]){0,1}([0-9]*)$/" ,$value) == 1;


Celle-ci est équivalente à :
/^-?[0-9]+(.[0-9][0-9][0-9])*(,[0-9])?[0-9]*$/

Elle acceptera « -0A000$000&000,1 » mais pas « 1. » ni « .01 ».

return ($american or $world);


Il reste à savoir ce que deviendra la valeur quand tu voudras utiliser
« -0A000$000&000,1 » ou « -00000,000,001 » comme un nombre (bon, là
c'est 0, mais avec « 1E027$000&000,1 » ça devrait donner 10^27...)

Merci de m'avoir montrer la voie.


Encore une fois, si tu décris précisément la syntaxe que tu veux
accepter et ce que tu veux rejeter, il sera alors possible d'écrire
une expression rationnelle adaptée à ton besoin.

Avatar
Olivier Berquin
voici ce que j'ai fait:

function my_is_numeric($value)
{
$valeur = preg_match('/^[-+]?[0-9]+([ .s]?[0-9]{3})*([ ,.s]?
[0-9])*?$/' ,$value);
return ($valeur);
}

Je suis assez large: j'accepte aussi bien le notation US que la FR (et
même un mélange des 2 -- hum).
Bon, je vous l'accorde, ce n'est pas trop "catholique". Mais c'est
pour l'intranet d'une petite société (15 personnes), et l'encodage de
ces montants n'incombera qu'à 3 personnes maximum.
Et il y a un une étape de confirmation...
Voici ce qui est accepté:
21 252,00
21.252,00
+21252,00
12 521,252.12 (ha ? ben oui... ça marche).
-0
+0
0
0,0
0.0
Ce qui ne l'est pas: dès qu'il y a un caractère autre qu'un chiffre...

Merci à tous pour votre aide.


Oli.
1 2 3 4