Foros del Web » Programando para Internet » PHP »

Cómo saber si un string es numérico?

Estas en el tema de Cómo saber si un string es numérico? en el foro de PHP en Foros del Web. Cómo saber que un string es numérico o no? $i='4,3'; echo gettype($i) ; // Imprime sting echo is_numeric($i); // Imprime false echo is_double($i); // Imprime ...
  #1 (permalink)  
Antiguo 21/08/2004, 18:00
 
Fecha de Ingreso: enero-2004
Mensajes: 235
Antigüedad: 13 años, 11 meses
Puntos: 0
Busqueda Cómo saber si un string es numérico?

Cómo saber que un string es numérico o no?

$i='4,3';
echo gettype($i) ; // Imprime sting
echo is_numeric($i); // Imprime false
echo is_double($i); // Imprime false

Código usado:
<?php
$i = array ('4,3','Hola','3.4','Hola, que tal?','23.454','23.454,456');
$linia = '';
foreach ($i as $val) {
$linia .= 'Antes: '.gettype($val).'('.$val.')<br>';
$val = strtr($val,',.','.,');
//settype($val,'double');
if (is_double($val)) $val = number_format($val,4);
$linia .= ' Despues: '.gettype($val).'('.$val.')<br><br><br>';
}
echo $linia;
?>

Si ejecutais el código comprovareis que ES UN ERROR, sustituir puntos por comas i viceversa, para transformat el numero a numeración americana.
No se dan los resultados esperados, de la misma forma en : " Hola, que tal?" no se tendria que substituir la coma por un punto.
  #2 (permalink)  
Antiguo 21/08/2004, 18:17
Avatar de Gerald  
Fecha de Ingreso: julio-2003
Mensajes: 1.356
Antigüedad: 14 años, 5 meses
Puntos: 2
www.php.net/is_numeric

Saludos
__________________
Solo por Hoy: Trataré de fortalecer mi mente. Estudiaré y aprenderé algo útil
Hoteldipity
Arte Caracol
  #3 (permalink)  
Antiguo 21/08/2004, 18:45
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
PHP no puede saber (salvo que lo indiques) si tu:
"4,3" .. o "4.3" o "hola soy 4.3" es un tipo "string","float" u otro ... Por eso siempre te dirá que eso es un "string". (cuando apliques tu gettype() ...). De hecho estás usando "comillas" .. así que eso será si o si una cadena (string) .. en tal caso quitale las comillas y observa. (usando el punto como separador de decimales)

Deberías usar en tu caso (si es que usas comillas en $i='4.3' ):
is_float() y asegurarte de que sea 4.3 y no 4,3 (usar puntos para separar decimales).

Hechale un vistazo al manual en este apartado:
http://www.php.net/manual/en/languag...ing.conversion

Un saludo,
  #4 (permalink)  
Antiguo 21/08/2004, 21:38
 
Fecha de Ingreso: enero-2004
Mensajes: 235
Antigüedad: 13 años, 11 meses
Puntos: 0
A ver, parece que no me he explicado bien, reformulo la pregunta:

Teniendo un string que contiene numeros y palabras, se quiere transformar los numeros float( numeros con decimales) a que tengan 2 decimales. Tener en cuenta el sistema metrico español, separador de millares=punto, separador de decimales=coma.

El string en particular es este:
METEO & WEBCAM Datos actuales en Camping Aquarius (Playa de Sant Pere Pescador) Fecha: 22 ago 2004 Hora Datos: 04:14:44 (GMT+1) Temperatura Presión Humedad Velocidad del viento Dirección del viento ºC ºF hPa % m/s Km/h kt Beaufort SW Garbí 21 69,8 1019 61 0,48 1,7 1 1 Ultimas 24 h: grafica

I se quiere conseguir esto:
METEO & WEBCAM Datos actuales en Camping Aquarius (Playa de Sant Pere Pescador) Fecha: 22 ago 2004 Hora Datos: 04:14:44 (GMT+1) Temperatura Presión Humedad Velocidad del viento Dirección del viento ºC ºF hPa % m/s Km/h kt Beaufort SW Garbí 21 69,80 1019 61 0,48 1,70 1 1 Ultimas 24 h: grafica

Se tranforman: 69,8 a 69,80 y 1,7 a 1,70.

0.El separador es el espacio (' ');

1.Tener en cuenta que para saber si es un float (is_float) el separador de decimales es el punto y el separador de millares es la coma (medidas americanas), por tanto is_float(69,8)=false y is_float(69.9)=true.

El código que usaria yo seria este:
Código PHP:
<?php

$cad 
'METEO & WEBCAM Datos actuales en Camping Aquarius';
$cad .= '(Playa de Sant Pere Pescador) Fecha: 22 ago 2004 Hora Datos:';
$cad .= '04:14:44 (GMT+1) Temperatura Presión Humedad Velocidad del';
$cad .= 'viento Dirección del viento ºC ºF hPa % m/s Km/h kt Beaufort SW';
$cad .= 'Garbí 21 69,8 1019 61 0,48 1,7 1 1 Ultimas 24 h: grafica';

$matriz_cad explode(' ',$cad);

foreach (
$matriz_cad as $val) {
    
$val_usa strtr($val,',.','.,'); // convetimos a numero americano
    
if (is_float($val_usa)) $cad_transf[] = number_format($val_usa,2);
    else 
$cad_transf[] = $val;
}

echo 
implode(' ',$cad_transf);

?>
El problema de este código es que no interpreta bien la instrucción is_float.

Última edición por jmaribau; 21/08/2004 a las 21:47
  #5 (permalink)  
Antiguo 22/08/2004, 01:54
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Bueno .. en ese caso tu "numero" siempre va a ser un string, por ende deberías tratar el tema desde el punto de vista de "cadenas" (strings) ..

Ahora bien, tu conoces que bajo tus condiciones .. si algo contiene un . (punto) despues de hacer el str_replace() por si hay comas .. tendrías que buscar esa "coma" en la cadena obtenida para sabe si es un "float" (ya que no puedes usar is_float() por qué atiende al tipo de la variable ...).

Sería:

Código PHP:
<?php

$cad 
'METEO & WEBCAM Datos actuales en Camping Aquarius';
$cad .= '(Playa de Sant Pere Pescador) Fecha: 22 ago 2004 Hora Datos:';
$cad .= '04:14:44 (GMT+1) Temperatura Presión Humedad Velocidad del';
$cad .= 'viento Dirección del viento ºC ºF hPa % m/s Km/h kt Beaufort SW';
$cad .= 'Garbí 21 69,8 1019 61 0,48 1,7 1 1 Ultimas 24 h: grafica';

$matriz_cad explode(' ',$cad);

foreach (
$matriz_cad as $val) {
   
$val_usa strtr($val,',.','.,'); // convetimos a numero americano

    
if (strpos($val_usa,'.')) $cad_transf[] = number_format($val_usa,2,',','.');
    else 
$cad_transf[] = $val;

}

echo 
implode(' ',$cad_transf);

?>
A su vez .. para number_format() tendras que indicar el caracter de separador de dedimales y de miles.

Un saludo,
  #6 (permalink)  
Antiguo 22/08/2004, 03:24
 
Fecha de Ingreso: enero-2004
Mensajes: 235
Antigüedad: 13 años, 11 meses
Puntos: 0
Nota: str_pos, tiene un problema y es que si existiera un "substring no numerico" que tubiera un punto, lo trasformaria en numerico i float dando cómo resultado 0.00

Cambios en el código:
Código PHP:
    setlocale (LC_ALL"sp");
    if (
is_numeric($val) && (substr_count($val,',') > 0))  $cad_transf[] =number_format($val,2); 
IMPORTANTE: Porque NO funciona con is_float() pero SI funciona con is_number(), si php es type juggling?
En el manual no pone nada al respecto, ni en los comentarios.

Código comprovar esto:
Código PHP:
<php>

$i '4.5';
if (
is_double($i)) echo 'Es float';
if (
is_numeric($i)) echo 'Es numero';
if (
is_integer($i)) echo 'Es entero';

echo 
'<'br>';

$i = 4.5;
if (is_double($i)) echo '
Es float';
if (is_numeric($i)) echo '
Es numero';;
if (is_integer($i)) echo '
Es entero';
echo '
<br>';
echo '
12.25='.is_numeric('12.25').'<br>'; // Return True
echo '
12,25='.is_numeric('12,25').'<br>'; // Return False
echo '
12.25='.is_float('12.25').'<br>'; //Return False
echo '
12,25='.is_float('12,25').'<br>; //Return False
?> 
  #7 (permalink)  
Antiguo 22/08/2004, 19:41
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Cita:
Nota: str_pos, tiene un problema y es que si existiera un "substring no numerico" que tubiera un punto, lo trasformaria en numerico i float dando cómo resultado 0.00
Ok, ..


Cita:
IMPORTANTE: Porque NO funciona con is_float() pero SI funciona con is_number(), si php es type juggling?
En el manual no pone nada al respecto, ni en los comentarios.
Podrías hacer tu comentario en dicha función a ver si responde alguien con algún fundamento teoríco del por qué.

Un saludo,
  #8 (permalink)  
Antiguo 22/08/2004, 22:57
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 14 años, 2 meses
Puntos: 41
Ok... pero la documentación de las funciones lo dice:
Cita:
Iniciado por manual
is_float -- Averigua si una variable es un flotante.
is_numeric -- Encuentra si una variable es un número o una cadena numérica
Saludos
  #9 (permalink)  
Antiguo 22/08/2004, 23:18
 
Fecha de Ingreso: enero-2004
Mensajes: 235
Antigüedad: 13 años, 11 meses
Puntos: 0
Jpinedo, y entonces cómo te las apañas para saber si una variable es "una cadena numerica float"?

No hay manera de saberlo a no ser que mires si tiene separador de decimales.

Cita:
Originalmente Escrito por manual
is_float -- Averigua si una variable es un flotante.
is_numeric -- Encuentra si una variable es un número o una cadena numérica
is_float -- Averigua si una VARIABLE es un flotante. Una variable que contiene un string es una varible, tendria que funcionar.

Que solución hay al respecto?

Última edición por jmaribau; 22/08/2004 a las 23:20
  #10 (permalink)  
Antiguo 22/08/2004, 23:30
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 14 años, 2 meses
Puntos: 41
La solución nn te la puedo dar por ahora... porque sencillamente nunca me había planteado esto y no sé cómo resolverlo... pero estoy averiguando.
Si la encuentras antes, postéala para poder conocerla todos.

Cita:
Una variable que contiene un string es una varible, tendria que funcionar.
Una variable que contiene un string es un "string" y no un "float" (o double).
Tampoco es un "numeric", pero la función is_numeric() es capaz de evaluar si ese string contiene un número hecho cadena.
Según el manual, es la única función capaz de reconocerlo.

Saludos
  #11 (permalink)  
Antiguo 22/08/2004, 23:45
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 14 años, 2 meses
Puntos: 41
Ok... lo que se puede hacer es primero preguntar si es numérico y si lo es, recién pasar por strpos()....
Código PHP:
foreach ($matriz_cad as $val) { 
    
$val_usa strtr($val,',.','.,'); // convetimos a numero americano 
    
if (is_numeric($val_usa)){
    if(
strpos($val_usa,'.')){
        
$cad_transf[] = number_format($val_usa,2);
    }else{
        
$cad_transf[] = $val_usa;
    } 
    }else{
    
$cad_transf[] = $val;
    } 

Saludos
  #12 (permalink)  
Antiguo 23/08/2004, 01:35
 
Fecha de Ingreso: enero-2004
Mensajes: 235
Antigüedad: 13 años, 11 meses
Puntos: 0
Cita:
Iniciado por jpinedo
Una variable que contiene un string es un "string" y no un "float" (o double).
Tampoco es un "numeric", pero la función is_numeric() es capaz de evaluar si ese string contiene un número hecho cadena.
Según el manual, es la única función capaz de reconocerlo.
Extraido del manual:
Cita:
is_float

(PHP 3, PHP 4 , PHP 5)
is_float -- Finds whether a variable is a float
Description
bool is_float ( mixed var)

Returns TRUE if var is a float, FALSE otherwise.

Note: To test if a variable is a number or a numeric string (such as form input, which is always a string), you must use is_numeric().

See also is_bool(), is_int(), is_integer(), is_numeric(), is_string(), is_array(), and is_object(),
Un "mixed var" que seria? Yo entiendo qualquier tipo de variable.
  #13 (permalink)  
Antiguo 23/08/2004, 16:38
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 14 años, 2 meses
Puntos: 41
ya nos vamos saliendo del tema... primero te pregunto...
¿¿te sirvió la forma que te propuse???


Ahora sí regresemos con lo otro...
Cita:
Un "mixed var" que seria? Yo entiendo qualquier tipo de variable.
Claro que es cualquier tipo de variable... o sea, la función acepta cualquier tipo de variable como parámetro... pero devuelve TRUE sólo si es FLOAT.... y FALSE si es otro tipo de variable (STRING, por ejemplo)... y "4.30" es de tipo STRING y no FLOAT.

A diferencia de esto, como te puse, la función is_numeric() también acepta cualquier tipo de variable como parámetro pero dice que devuelve TRUE si es numérico o una cadena numérica...

O sea, aclarando:
"4.3" es una cadena numérica, no es un número.
El manual dice que is_float() no valida cadenas numéricas.
is_float("4.3");//FALSE
El manual dice que is_numeric() sí valida cadenas numéricas.
is_numeric("4.3");//TRUE

está bien especificado. (creo).

Saludos
PD:Responde si funcionó lo que te propuse antes.

Última edición por jpinedo; 23/08/2004 a las 16:42
  #14 (permalink)  
Antiguo 23/08/2004, 18:58
 
Fecha de Ingreso: enero-2004
Mensajes: 235
Antigüedad: 13 años, 11 meses
Puntos: 0
Ja lo tenia programado así, pero me jodia poner tantas linias para una cosa tan sencilla.
De todas maneras, gracias.

PD: no creo que se use mucho el is_float ya que normalmente el origen de los numeros con decimales son strings o arrays que contienen numeros que al extraerlos, php los contempla cómo strings.

Una preguntilla: que editor de php usas?, yo editplus, pero me falta el debugger.

Un saludo, jpinedo y hasta la pròxima.

Última edición por jmaribau; 23/08/2004 a las 19:00
  #15 (permalink)  
Antiguo 23/08/2004, 22:21
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 14 años, 2 meses
Puntos: 41
Lo que puedes hacer es, ya que el php no lo implementa... una función propia:
Código PHP:
function is_cadFloat($variable){
    if (
is_numeric($variable)){ 
        if(
strpos($variable,'.')){ 
            return 
true;
    }else{
        return 
false;
    }

O algo así.

Saludos

PD: Yo hasta ahora no he necesitado más que colorear el código y numerar las líneas. Utilizo el Dreamweaver MX porque ya lo tenía instalado. Además utilizo mucho el cliente FTP que trae... pero no es que piense que es lo máximo... simplemente lo utilizo porque ahí está.
  #16 (permalink)  
Antiguo 24/08/2004, 04:00
 
Fecha de Ingreso: enero-2004
Mensajes: 235
Antigüedad: 13 años, 11 meses
Puntos: 0
Hola, creo que es mejor hacerlo de esta manera: Porque no todo el mundo tiene el punto cómo separador de decimales, entonces tienes que mirar cómo tienen configurado el sistema numérico.

Código PHP:
function is_strFloat($var){
    
$info localeconv();
    if (
is_numeric($var) && (strpos($var,$info['decimal_point'])) return true;
    else return 
false;

O si lo prefieres aún más pequeño!
Código PHP:
function is_strFloat($var){
    
$info localeconv();
    return (
is_numeric($var) && strpos($var,$info['decimal_point'])? true false;

  #17 (permalink)  
Antiguo 24/08/2004, 04:17
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 15 años, 5 meses
Puntos: 16
Hola,

Quizas para tu problema concreto lo mejor es no pensar en numeros, sino en patrones. Supongo que podria encontrarse una expresion regular que coincida las cadenas que quieres modificar.

Saludos.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #18 (permalink)  
Antiguo 24/08/2004, 16:41
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 14 años, 2 meses
Puntos: 41
Bueno... te has dado tú mismo la respuesta...
Lo que te sugiero es hacer algunas pruebas de esa función y si todo va bien... la publicas en el espacio para comentarios de los usuarios de la función is_float() o is_double() como una alternativa que planteas para validar cadenas numéricas de tipo FLOAT.
De esa forma puedes contribuir con otros que puedan tener tu problema.

Saludos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:55.