Cadena PHP para flotar

120

No estoy familiarizado con PHP en absoluto y tenía una pregunta rápida.

Tengo 2 variables pricePerUnity InvoicedUnits. Aquí está el código que establece estos valores:

$InvoicedUnits = ((string) $InvoiceLineItem->InvoicedUnits);
$pricePerUnit = ((string) $InvoiceLineItem->PricePerUnit);

Si saco esto, obtengo los valores correctos. Digamos 5000unidades facturadas y 1.00por precio.

Ahora, necesito mostrar la cantidad total gastada. Cuando multiplico estos dos juntos, no funciona (como se esperaba, son cadenas).

Pero no tengo ni idea de cómo analizar / convertir / convertir variables en PHP.

¿Qué tengo que hacer?

Nik
fuente

Respuestas:

201
$rootbeer = (float) $InvoicedUnits;

Debería hacerlo por ti. Echa un vistazo a Type-Juggling . También debería leer Conversión de cadenas a números .

Sampson
fuente
Es el método más simple ... pero ocasionalmente me he encontrado con problemas al hacer esto con ciertas configuraciones de base de datos y VARCHAR>11en longitud ... todavía no he definido exactamente por qué.
Talvi Watia
2
^ vale la pena señalar que (float) elimina 0 de la cadena si es el primer dígito
También tenga en cuenta que "11,000.00" generará 11 en lugar de las
11000.00
64

Desea que la no-localidad cuenta floatvalla función :

float floatval (mixed $ var): obtiene el valor flotante de una cadena.

Ejemplo:

$string = '122.34343The';
$float  = floatval($string);
echo $float; // 122.34343
Earino
fuente
4
felicitaciones por mencionar la conciencia local. Pasé 1,5 h rastreando un problema causado por diferentes configuraciones regionales que causaban la (float)conversión en el primer servidor a "," y en el segundo a ","
Dr. Gianluigi Zane Zanettini
23

Bueno, si el usuario escribe 1,00,000, floatvar mostrará un error. Entonces -

floatval(preg_replace("/[^-0-9\.]/","",$input));

Esto es mucho más confiable.

Uso:

$input = '1,03,24,23,434,500.6798633 this';
echo floatval(preg_replace("/[^-0-9\.]/","",$input));
HADI
fuente
7
En lugar de ereg use preg $string=preg_replace("/[^0-9\.\-]/","",$string);
ontananza
4
Sí, ereg, esta función ha sido anulada. Así que necesito usar preg en lugar de ereg :)
HADI
9

Lidiar con el marcado en flotantes no es una tarea trivial. En la notación inglesa / americana, formatea mil más 46*10-2:

1,000.46

Pero en Alemania, cambiarías la coma y el punto:

1.000,46


Esto hace que sea realmente difícil adivinar el número correcto en aplicaciones en varios idiomas.
Sugiero encarecidamente utilizar Zend_MeasureZend Framework para esta tarea. Este componente analizará la cadena a un flotante según el idioma del usuario.

Tobias P.
fuente
3
Hoy en día (+3 años), se podría usar NumberFormatter a partir de PHP 5.3 con la intlextensión.
Zamnuts
1
PHP 5.3 estaba disponible cuando respondí la pregunta, pero hasta su comentario no estaba al tanto de esta función única ya que hay docenas de bibliotecas que hacen algo similar. Pero no tendrán una cobertura de configuraciones regional tan buena como la que tiene la extensión intl. Gracias, intentaré recordarlo.
Tobias P.
1

Utilice esta función para emitir un valor flotante desde cualquier tipo de estilo de texto:

function parseFloat($value) {
    return floatval(preg_replace('#^([-]*[0-9\.,\' ]+?)((\.|,){1}([0-9-]{1,3}))*$#e', "str_replace(array('.', ',', \"'\", ' '), '', '\\1') . '.\\4'", $value));
}

Esta solución no depende de ninguna configuración regional. Por lo tanto, para la entrada del usuario, los usuarios pueden escribir valores flotantes de la forma que deseen. Esto es realmente útil, por ejemplo, cuando tiene un proyecto que está solo en inglés, pero personas de todo el mundo lo están usando y es posible que no tengan en cuenta que el proyecto quiere un punto en lugar de una coma para los valores flotantes. Puede agregar javascript y obtener la configuración predeterminada de los navegadores, pero aún así muchas personas establecen estos valores en inglés, pero aún escriben 1,25 en lugar de 1,25 (especialmente, pero no se limitan a la industria de la traducción, investigación y TI)

Hafenkranich
fuente
algún comentario sobre por qué esto es malo / dónde falla?
Hafenkranich
¿O hay una forma igualmente flexible que es más rápida?
Hafenkranich
1
Utiliza la bandera e, que "ya no es compatible". Esa es mi suposición.
Leif
0

Me estaba encontrando con un problema con la forma estándar de hacer esto:

$string = "one";

$float = (float)$string;

echo $float; : ( Prints 0 )

Si no hay un número válido, el analizador no debería devolver un número, debería arrojar un error. (Esta es una condición que estoy tratando de detectar en mi código, YMMV)

Para solucionar esto, he hecho lo siguiente:

$string = "one";

$float = is_numeric($string) ? (float)$string : null;

echo $float; : ( Prints nothing )

Luego, antes de seguir procesando la conversión, puedo verificar y devolver un error si no hubo un análisis válido de la cadena.

Morris Buel
fuente
0

Si necesita manejar valores que no se pueden convertir por separado, puede usar este método:

try {
    $valueToUse = trim($stringThatMightBeNumeric) + 0;
} catch (\Throwable $th) {
    // bail here if you need to
}
Jannie Theunissen
fuente
0

puede seguir este enlace para saber más sobre cómo convertir una cadena / número en número / flotante / decimal en PHP. AQUÍ ES LO QUE DICE ESTE ENLACE ...

Método 1: Uso de la función number_format (). La función number_format () se usa para convertir una cadena en un número. Devuelve el número formateado en caso de éxito; de lo contrario, da E_WARNING en caso de error.

$num = "1000.314"; 

//Convert string in number using  
//number_format(), function 
echo number_format($num), "\n"; 

//Convert string in number using  
//number_format(), function 
echo number_format($num, 2); 

Método 2: Uso de conversión de tipos: la conversión de tipos puede convertir directamente una cadena en un tipo primitivo flotante, doble o entero. Esta es la mejor forma de convertir una cadena en un número sin ninguna función.

// Number in string format 
$num = "1000.314"; 

// Type cast using int 
echo (int)$num, "\n"; 

// Type cast using float 
echo (float)$num, "\n"; 

// Type cast using double 
echo (double)$num; 

Método 3: Uso de la función intval () y floatval (). Las funciones intval () y floatval () también se pueden usar para convertir la cadena en sus valores enteros y flotantes correspondientes, respectivamente.

// Number in string format 
$num = "1000.314"; 

// intval() function to convert  
// string into integer 
echo intval($num), "\n"; 

// floatval() function to convert 
// string to float 
echo floatval($num); 

Método 4: sumando 0 o realizando operaciones matemáticas. El número de cadena también se puede convertir en un número entero o flotante agregando 0 con la cadena. En PHP, al realizar operaciones matemáticas, la cadena se convierte en un entero o flotante implícitamente.

// Number into string format 
$num = "1000.314"; 

// Performing mathematical operation  
// to implicitly type conversion 
echo $num + 0, "\n"; 

// Performing mathematical operation  
// to implicitly type conversion 
echo $num + 0.0, "\n"; 

// Performing mathematical operation  
// to implicitly type conversion 
echo $num + 0.1;
Manoj
fuente