2010-11-12 172 views
7

cómo validar números decimales en PHP. Miré a is_numeric(), pero que no va a funcionar para mí:cómo validar números decimales en PHP

bool is_numeric (mixed var)

Encuentra si la variable dada es numérico. Las cadenas numéricas constan de signo opcional, cualquier número de dígitos, parte decimal opcional y parte exponencial. Por lo tanto + 0123.45e6 es un valor numérico válido. La notación hexadecimal (0xFF) está permitida también pero solo sin signo, decimal y parte exponencial.

No deseo la partición del exponente o la notación hexadecimal. El usuario ingresará valores decimales simples y no quiero un tipo-o que simplemente sea un exponente o valor hexadecimal válido para pasar. Me gustaría que los números decimales "tradicionales" sean válidos.

EDIT aquí una página simple (fuerza bruta) que contiene datos de prueba mucho más completos (lo que debe y no debe considerarse un valor numérico).

<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

Sólo por motivo de las discusiones, que no debería ser indulgente con algo como '' ++ o --1' 1'? –

+0

@Jason McCreary, los datos son utilizados por algo que no es indulgente en algo como '--1' o' ++ 1' – xyz

+0

¿Debe considerarse '.5' como válido (como' 0.5')? – Hammerite

Respuesta

6

actualizada con los datos de prueba.

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

$valid = TestFunction($input); 

o recortar la entrada primera

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

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

Esto funciona muy bien !!!! – xyz

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

Eso no coincidirá con los valores que contienen un solo dígito, creo/^ [+ \ -]? \ d + (?: \. \ d +)? $/might work –

+0

@rr: Coincide bien con un solo dígito. No soy un experto en expresiones regulares, así que lo conecté a un archivo; pero, por lo que yo sé, la posibilidad de un solo dígito es lo que el '()?' alrededor de '\. \ d +' es para. – pinkgothic

+0

Los paréntesis no estaban allí cuando inicialmente hice el comentario :) –

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

¿Qué pasa con una expresión regular? preg_match(/[+\-]?\d*(\.\d+)?([eE][+\-]?d+)?/,$var); El bit [eE] y luego permite a las personas ingresar 2.3e2 para números realmente grandes o realmente pequeños, por lo tanto déjalo en blanco si no lo deseas. Todo esto permitirá:

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

La expresión regular sería algo como

[[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

Olvidé incluir esto en mis valores de muestra, pero '.5' no funciona con este código. – xyz

0
$value = (float)$value; 
Cuestiones relacionadas