with strip_tags remove ent_quotes ejemplo php parsing floating-point currency

strip_tags - PHP: dinero sin formato



strip_tags wordpress (8)

¿Hay alguna manera de obtener el valor flotante de una cadena como esta: 75,25 € , aparte de parsefloat(str_replace('','', ''.'', $var)) ?

Quiero que esto dependa del idioma actual del sitio, y algunas veces la coma podría reemplazarse por un punto.


Casting es tu amigo:

$int = (int) $string;

Actualización basada en op :

Pruebe algo como esto:

<?php function extract_numbers($string) { return preg_replace("/[^0-9]/", '''', $string); } echo extract_numbers(''$100''); ?>

Demostración: http://codepad.org/QyrfS7WE


Esta es una solución un poco más compleja / lenta, pero funciona con todas las configuraciones regionales. Debido a que la solución @ rlenom funciona solo con puntos como separador decimal, y algunas configuraciones regionales, como la española, usa la coma como separador decimal.

<?php public function getAmount($money) { $cleanString = preg_replace(''/([^0-9/.,])/i'', '''', $money); $onlyNumbersString = preg_replace(''/([^0-9])/i'', '''', $money); $separatorsCountToBeErased = strlen($cleanString) - strlen($onlyNumbersString) - 1; $stringWithCommaOrDot = preg_replace(''/([,/.])/'', '''', $cleanString, $separatorsCountToBeErased); $removedThousendSeparator = preg_replace(''/(/.|,)(?=[0-9]{3,}$)/'', '''', $stringWithCommaOrDot); return (float) str_replace('','', ''.'', $removedThousendSeparator); }

Pruebas:

[''1,10 USD'', 1.10], [''1 000 000.00'', 1000000.0], [''$1 000 000.21'', 1000000.21], [''£1.10'', 1.10], [''$123 456 789'', 123456789.0], [''$123,456,789.12'', 123456789.12], [''$123 456 789,12'', 123456789.12], [''1.10'', 1.1], ['',,,,.10'', .1], [''1.000'', 1000.0], [''1,000'', 1000.0]

Advertencias: falla si la parte decimal tiene más de dos dígitos.

Esta es una implementación de esta biblioteca: https://github.com/mcuadros/currency-detector


Necesitarás eliminar el símbolo de moneda de la cadena. El intval de PHP se detiene en el primer carácter no numérico que encuentra.

$int = intval(preg_replace(''/[^/d/.]/'', '''', ''$100'')); // 100

Aunque si tiene un valor como $100.25 , puede usar floatval en floatval lugar.

$float = floatval(preg_replace(''/[^/d/.]/'', '''', ''$100.25'')); // 100.25


PHP tiene intval ( aquí están los documentos ), que es (por lo que puedo decir) exactamente lo mismo que parseInt de JavaScript.

Sin embargo, para lo que valga la pena, no creo que ninguna de las funciones te ayude con lo que intentas hacer. Debido a que el primer carácter no es numérico, ambos se asustarán (PHP le dará 0, JS le dará NaN ). Entonces, en cualquier idioma, vas a tener que hacer un análisis sintáctico de cadenas / expresiones regulares.



Soy un novato, por lo que probablemente haya una desventaja obvia (para otros, no para mí) en el siguiente enfoque, pero pensé que lo compartiría de todos modos. Me interesaría saber si es más rápido o más lento que usar preg_replace, pero no hice ninguna prueba de velocidad.

$badChars = array("$", ",", "(", ")"); $dirtyString = "($3,895.23)"; $cleanString = str_ireplace($badChars, "", $dirtyString); echo "$dirtyString becomes $cleanString<p>";

$ dirtyString puede ser una matriz, entonces:

$badChars = array("$", ",", "(", ")"); $dirtyStrings = array("($3,895.23)", "1,067.04", "$5683.22", "$9834.48"); $cleanStrings = str_ireplace($badChars, "", $dirtyStrings); echo var_dump($cleanStrings);


Tuve un problema similar en el que no recibí el símbolo de moneda, solo las cadenas (es decir: 1,234,567.89 o 1.234.567,89).

Esto me ayudó a normalizar ambos casos en carrozas:

$val = str_replace(",", ".", $formatted); $val = preg_replace("/[/,/.](/d{3})/", "$1", $val);

Pero la respuesta de Gordon es mucho más clara.


use ereg_replace

$string = "$100,000"; $int = ereg_replace("[^0-9]", "", $string); echo $int;

salidas

1000000

function toInt($str) { return (int)preg_replace("//..+$/i", "", preg_replace("/[^0-9/.]/i", "", $str)); }

Actualizar

<?php $string = array("$1,000,000.00","$1 000 000.00","1,000 000.00","$123","$123 456 789","0.15¢"); foreach($string as $s) { echo $s . " = " . toInt($s) . "/n"; } function toInt($str) { return preg_replace("/([^0-9//.])/i", "", $str); } ?>

Salidas

$1,000,000.00 = 1000000.00 $1 000 000.00 = 1000000.00 1,000 000.00 = 1000000.00 $123 = 123 $123 456 789 = 123456789 0.15¢ = 0.15

y si lo lanzas como un entero

<?php $string = array("$1,000,000.00","$1 000 000.00","1,000 000.00","$123","$123 456 789","0.15¢"); foreach($string as $s) { echo $s . " = " . _toInt($s) . "/n"; } function _toInt($str) { return (int)preg_replace("/([^0-9//.])/i", "", $str); } ?>

salidas

$1,000,000.00 = 1000000 $1 000 000.00 = 1000000 1,000 000.00 = 1000000 $123 = 123 $123 456 789 = 123456789 0.15¢ = 0

Entonces ahí lo tienes. una sola línea, una reemplazar. eres bueno para ir.