float - string casting php
PHP: intval() equivalente para nĂºmeros>=2147483647 (6)
Además de number_format, puedes usar sprintf:
sprintf("%.0f", 3147483647.37) // 3147483647
Sin embargo, ambas soluciones sufren de desbordamiento de flotadores, por ejemplo:
sprintf("%.0f", 314734534534533454346483647.37) // 314734534534533440685998080
En PHP 5, uso intval () cada vez que obtengo números como entrada. De esta manera, quiero asegurarme de no obtener cadenas ni números flotantes. Mis números de entrada deben estar todos en números enteros. Pero cuando obtengo números> = 2147483647, el límite del entero con signo se cruza.
¿Qué puedo hacer para tener un equivalente intval () para números en todos los tamaños?
Esto es lo que quiero tener:
<?php
$inputNumber = 3147483647.37;
$intNumber = intvalEquivalent($inputNumber);
echo $intNumber; // output: 3147483647
?>
¡Muchas gracias por adelantado!
Edición: Basado en algunas respuestas, he intentado codificar una función equivalente. Pero no funciona exactamente como lo hace intval () todavía. ¿Cómo puedo mejorarlo? ¿Qué tiene de malo?
function intval2($text) {
$text = trim($text);
$result = ctype_digit($text);
if ($result == TRUE) {
return $text;
}
else {
$newText = sprintf(''%.0f'', $text);
$result = ctype_digit($newText);
if ($result == TRUE) {
return $newText;
}
else {
return 0;
}
}
}
O use number_format($inputNumber, 0, '''', '''')
O si solo quiere verificar si es un número entero, use ctype_digit($inputNumber)
No utilice el is_numeric
propuesto, ya que también los flotantes son numéricos. por ejemplo, "+ 0123.45e6" es aceptado por is_numeric
Pruebe esta función, eliminará correctamente cualquier decimal como lo hace intval y eliminará cualquier carácter no numérico.
<?php
function bigintval($value) {
$value = trim($value);
if (ctype_digit($value)) {
return $value;
}
$value = preg_replace("/[^0-9](.*)$/", '''', $value);
if (ctype_digit($value)) {
return $value;
}
return 0;
}
// SOME TESTING
echo ''"3147483647.37" : ''.bigintval("3147483647.37")."<br />";
echo ''"3498773982793749879873429874.30872974" : ''.bigintval("3498773982793749879873429874.30872974")."<br />";
echo ''"hi mom!" : ''.bigintval("hi mom!")."<br />";
echo ''"+0123.45e6" : ''.bigintval("+0123.45e6")."<br />";
?>
Aquí está la salida producida:
"3147483647.37" : 3147483647
"3498773982793749879873429874.30872974" : 3498773982793749879873429874
"hi mom!" : 0
"+0123.45e6" : 0
¡Espero que ayude!
Si desea manejar números de precisión arbitraria, necesitará usar la extensión gmp . La función gmp_init()
, por ejemplo, convierte una cadena en un objeto de recurso gmp. El inconveniente es que debe usar otras funciones de esa extensión para procesar aún más ese objeto. La conversión de nuevo a una cadena se realiza mediante gmp_strval()
, por ejemplo.
$gmpObject = gmp_init($string, 10);
if ($gmpObject === FALSE) {
# The string was not a valid number,
# handle this case here
}
echo gmp_strval($gmpObject);
Es posible que desee verificar solo que la cadena representa un número válido y usar la cadena en sí misma, si no tiene intención de realizar ninguna operación en el valor. Eso se puede hacer usando una expresión regular:
$containsInt = preg_match(''/^/d+$/'', $string);
# Or for floating point numbers:
$containsFloat = preg_match(''/^/d+(./d+)?$/'', $string);
echo $string;
Otra opción es usar is_numeric()
. Pero esa función hace más conversión de la que te gustaría. Citando documentos de esa función:
... + 0123.45e6 es un valor numérico válido ...
También puede usar expresiones regulares para eliminar todo después de las partes numéricas iniciales:
<?php
$inputNumber = "3147483647.37";
$intNumber = preg_replace(''/^([0-9]*).*$/'', "//1", $inputNumber);
echo $intNumber; // output: 3147483647
?>
<?php
$a = 453453445435.4;
echo $bigint = floor($a);