7
votes

Comment valider des nombres décimaux dans PHP

Comment valider des nombres décimaux dans PHP. J'ai regardé is_numeric () mais cela ne fonctionnera pas pour moi:

BOOL IS_Numeric (var)

trouve si la variable donnée est numérique. Les chaînes numériques sont constituées de signe facultatif, n'importe quel nombre de chiffres, partie décimale optionnelle et facultative partie exponentielle . Ainsi + 0123.45E6 est un Valeur numérique valide. hexadécimal la notation (0xFF) est autorisée trop mais seulement sans signe, décimal et partie exponentielle.

Je ne veux pas la partie exposante ou la notation hexadécimale. L'utilisateur entrera dans des valeurs décimales simples et je ne veux pas de type-O qui arrive à être un exposant ou une valeur hexagone valide pour passer le passé. J'aimerais juste que les nombres décimaux "traditionnels" soient confondés valides.

Modifier une page simple (force brute) qui contient des données de test beaucoup plus complètes (ce qui devrait et devrait ne pas être considéré comme une valeur numérique). xxx


4 commentaires

Juste pour les arguments, ne devriez-vous pas être indulgent sur quelque chose comme - 1 ou ++ 1 ?


@Jason McCreary, les données sont utilisées par quelque chose qui n'est pas indulgent sur quelque chose comme - 1 ou ++ 1


Devrait .5 être considéré comme valide (comme 0.5 )?


Fonction IS_Numeric PHP php.net/manual/fr/function.is-numeric.php


6 Réponses :


1
votes
$decimal = preg_match('/^[+\-]?\d+(\.\d+)?$/', $value) ? (float)$value : 0.0;

4 commentaires

Cela ne correspondra pas aux valeurs contenant un seul chiffre, je crois /^[+\-]?d+(?:\.\d+)?$/ pourrait fonctionner


@RR: Il correspond à l'amende des chiffres simples. Je ne suis pas un expert de regex, donc je l'ai branché dans un fichier; Mais autant que je sache, la possibilité à un chiffre est ce que le ()? autour du \. \ d + est pour.


Les parenthèses n'étaient pas là quand j'avais initialement fait le commentaire :)


J'ai oublié d'inclure cela dans mes valeurs d'échantillons, mais .5 ne fonctionne pas avec ce code.



0
votes
$number = preg_match($number, '/\\A\\s*[+\\-]?\\d*(\\.\\d+)?\\s*\\Z/') ? 
          trim($number) :
          'INVALID';
if ($number === '') { $number = '0'; }
if ($number === 'INVALID') {
    // handle
}

0 commentaires

0
votes

Qu'en est-il d'une expression régulière? Preg_Match (/ [+ \ - -]? \ d * (\ \ \ d +)? ([[ee] [+ \ -]? D +)? /, $ var); Code> Le [ EE] code> Bit et après avoir permis aux personnes d'entrer 2.3e2 pour des nombres vraiment gros ou vraiment petits, alors laissez cela si vous ne le voulez pas. Tout cela permettra:

2
0.3
.3
2.2
+2.2
-2.2
2.3e3
2.3E-3


0 commentaires

0
votes

L'expression régulière ressemblerait à quelque chose comme xxx


1 commentaires

J'ai oublié d'inclure cela dans mes valeurs d'échantillons, mais .5 ne fonctionne pas avec ce code.



6
votes

mis à jour avec vos données de test. xxx

ou couper l'entrée d'abord xxx


0 commentaires

0
votes
$value = (float)$value;

0 commentaires