2012-08-07 12 views
10

Estoy tratando de verificar php si una cadena es doble o no.Comprobando si una cadena es un doble o no

Aquí está mi código:

if(floatval($num)){ 
     $this->print_half_star(); 
    } 

$ num es un problema string..The es que incluso cuando hay un int que da la verdadera. ¿Hay alguna manera de comprobar si es un flotador y no un int?

+0

¿Desea ejecutar print_half_star() para cadenas como "4.0"? –

Respuesta

13
// Try to convert the string to a float 
$floatVal = floatval($num); 
// If the parsing succeeded and the value is not equivalent to an int 
if($floatVal && intval($floatVal) != $floatVal) 
{ 
    // $num is a float 
} 
+0

Tu respuesta es mejor ...Samuel –

+2

floatval ("24.0") // 24, Entonces tu intval ($ floatVal)! = $ FloatVal será falso – pszaba

+0

parece no funcionar para cadenas como "75.00": http://sandbox.onlinephpfunctions.com/code/49bad34c2e9b4c417c0711af275014e10d135952 – wutzebaer

7

Esto omitir valores enteros representados como cadenas:

if(is_numeric($num) && strpos($num, ".") !== false) 
{ 
    $this->print_half_star(); 
} 
+0

buen método..hay pensado en ello –

4

Puede intentar esto:

function isfloat($num) { 
    return is_float($num) || is_numeric($num) && ((float) $num != (int) $num); 
} 

var_dump(isfloat(10));  // bool(false) 
var_dump(isfloat(10.5)); // bool(true) 
var_dump(isfloat("10")); // bool(false) 
var_dump(isfloat("10.5")); // bool(true) 
+0

Agradable y corto ... gracias –

1

Por qué no usar la magia de la expresión regular

<?php 
$p = '/^[0-9]*\.[0-9]+$/'; 
$v = '89.00'; 
var_dump(preg_match($p, $v)); 
$v = '.01'; 
var_dump(preg_match($p, $v)); 
$v = '0.01'; 
var_dump(preg_match($p, $v)); 
$v = '89'; 
var_dump(preg_match($p, $v)); 
+2

Esa expresión regular no coincidirá con los formatos de números especiales que contienen notación científica http://php.net/manual/en/language.types.float.php – Samuel

+0

@Samuel gracias buen punto. –

+1

$ p = '/^-? [0-9] + (\. [0-9] +)? $ /'; Este permite números negativos, y números enteros como números dobles. – hamboy75

0

si "formato de doble cadena" como este "XXXXXX.XXXXXX"

trate de comprobar

function check_double_string($str){ 
$pairs = explode('.',$str); 
if (is_array($pairs) && count($pairs)==2) { 
    return (is_numeric($pairs[0]) && is_numeric($pairs[1])? true : false; 
} 
return false; 
} 
+0

Creo que tienes demasiado código allí ... la primera devolución podría simplemente devolver verdadero –

0

el fin de obtener todos los casos de un flotador que tenemos que añadir la espalda de cualquier cero hasta el fin de que puedan cortó por floatval() o encasillamiento (float)$num

$num='17.000010'; 
$num_float = (float)$num; //$num_float is now 17.00001 
//add the zero's back to $num_float 
while (strlen ($num) > strlen ($num_float)) $num_float = $num_float . '0'; //$spot_float in now a string again 


if($num_float != $num) then $num was no double :; 

nota !== no se utilizó sólo en caso de $num_float nunca fue convertida de nuevo en una cadena mediante la adición de ceros. tal sería el caso para los valores que no terminaron en 0.

Cuestiones relacionadas