2010-11-12 6 views
7

comment valider les nombres décimaux en PHP. Je regardais is_numeric() mais cela ne marchera pas pour moi:comment valider les nombres décimaux en PHP

bool is_numeric (mixte var)

si la variable donnée est numérique. Les chaînes numériques sont constituées du signe facultatif , un nombre quelconque de chiffres, la partie décimale facultative et la partie exponentielle facultative. Ainsi, + 0123.45e6 est une valeur numérique valide de . La notation hexadécimale (0xFF) est autorisée aussi mais seulement sans signe, décimal et partie exponentielle.

Je ne veux pas la partie exponentielle ou la notation hexadécimale. L'utilisateur saisira des valeurs décimales simples et je ne veux pas qu'un type-o qui se trouve être un exponent valide ou une valeur hexadécimale puisse passer. Je voudrais simplement que les nombres décimaux "traditionnels" soient considérés comme valides.

EDIT ici une page simple (force brute) qui contient des données de test beaucoup plus complet (ce qui devrait et ne devrait pas être considérée comme une valeur numérique).

<html><head></head> 
<body> 

<?php 

function TestFunction($s_value) { 
    // 
    // your code here 
    // 
    return; //true or false; 
} 

print '<b>these are valid numbers and should return "true"</b><br>'; 
print '<pre>'; 
    $s_value='123';  print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false'); 
    $s_value='+1';  print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false'); 
    $s_value='-1';  print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false'); 
    $s_value=' 1';  print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false'); 
    $s_value='1 ';  print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false'); 
    $s_value=' 1 '; print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false'); 
    $s_value='1';  print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false'); 
    $s_value='12345.1'; print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false'); 
    $s_value='6789.01'; print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false'); 
    $s_value='-1.1'; print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false'); 
    $s_value='+1.1'; print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false'); 
    $s_value='0';  print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false'); 
    $s_value='00001.1'; print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false'); 
    $s_value='.1';  print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false'); 
    $s_value='.0000001';print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false'); 
    $s_value='5.';  print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false'); 
print '</pre>'; 

print '<br><b>these are NOT valid numbers and should return "false"</b><br>'; 
print '<pre>'; 

    $s_value='--------------------------------';print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false'); 
    $s_value=null;  print "\n".'$s_value=null, TestFunction()='.(TestFunction($s_value)?'true':'false'); 
    $s_value='.';  print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false'); 
    $s_value='';  print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false'); 
    $s_value=' ';  print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false'); 
    $s_value=' ';  print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false'); 
    $s_value='1abc'; print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false'); 
    $s_value='$1';  print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false'); 
    $s_value='[email protected]';  print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false'); 
    $s_value='1.2.1'; print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false'); 
    $s_value='abc';  print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false'); 
    $s_value='1.45e6'; print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false'); 
    $s_value='0xFF'; print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false'); 
    $s_value='++1';  print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false'); 
    $s_value='--1';  print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false'); 
    $s_value='1+';  print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false'); 
    $s_value='1-';  print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false'); 
    $s_value='a1';  print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false'); 
    $s_value='#1';  print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false'); 
    $s_value='10.e5'; print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false'); 
    $s_value='0x1';  print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false'); 
    $s_value='0x';  print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false'); 
print '</pre>'; 

?> 

</body> 
</html> 
+0

Juste pour l'amour des arguments, ne devrait pas vous faire preuve d'indulgence sur quelque chose comme '' ++ ou --1' 1'? –

+0

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

+0

Doit-on considérer que '.5' est valide (comme' 0.5')? – Hammerite

Répondre

6

Mise à jour avec vos données de test.

function TestFunction($s_value) { 
    $regex = '/^\s*[+\-]?(?:\d+(?:\.\d*)?|\.\d+)\s*$/'; 
    return preg_match($regex, $s_value); 
} 

$valid = TestFunction($input); 

Ou couper l'entrée premier

function TestFunction($s_value) { 
    $regex = '/^[+\-]?(?:\d+(?:\.\d*)?|\.\d+)$/'; 
    return preg_match($regex, $s_value); 
} 

$input = trim($input); 
$valid = TestFunction($input); 
+0

Cela fonctionne super !!!! – xyz

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

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

+0

@rr: Il correspond bien à un seul chiffre. Je ne suis pas un expert en regex, donc je l'ai branché sur un fichier; mais pour autant que je sache, la possibilité d'un seul chiffre est ce que le '()?' autour du '\. \ d +' est pour. – pinkgothic

+0

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

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

Qu'en est-il une expression régulière? preg_match(/[+\-]?\d*(\.\d+)?([eE][+\-]?d+)?/,$var); Le bit [eE] et après il permet aux gens d'entrer 2.3e2 pour vraiment grand ou vraiment petit nombre, alors laissez-le si vous ne le voulez pas. Toute cette affaire permettra:

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

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

[[email protected] ~]$ cat test.php 
<?php 

$regex = "/^([+-]{1})?[0-9]+(\.[0-9]+)?$/"; 

$numbers = array("1", "12345.1", "6789.01", "-1.1", "+1.1", "0", "00001.1"); 

foreach($numbers as $number) { 

     print preg_match($regex, $number)."\n"; 

} 
[[email protected] ~]$ php -e test.php 
1 
1 
1 
1 
1 
1 
1 
+0

J'ai oublié d'inclure ceci dans mes valeurs d'exemple, mais '.5' ne fonctionne pas avec ce code. – xyz

0
$value = (float)$value; 
Questions connexes