PHP: unformat money

Есть ли способ получить значение float такой строки: 75,25 € , кроме parsefloat(str_replace(',', '.', $var)) ?

Я хочу, чтобы это зависело от текущего языка сайта, и иногда запятая могла быть заменена точкой.

Вы можете использовать

  • NumberFormatter::parseCurrencyNumberFormatter::parseCurrency номера валюты

Пример из руководства:

 $formatter = new NumberFormatter('de_DE', NumberFormatter::CURRENCY); var_dump($formatter->parseCurrency("75,25 €", $curr)); 

дает: float(75.25)

Обратите внимание, что внутреннее расширение не включено по умолчанию. См. Инструкции по установке .

использовать ereg_replace

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

выходы

1000000

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

Обновить


 <?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); } ?> 

Выходы

 $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 

и если вы ставите его как целое число

 <?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); } ?> 

выходы

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

Итак, у вас это есть. одна линия, одна замена. вам хорошо идти.

Это немного более сложное / медленное решение, но работает со всеми локалями. Поскольку решение @ rlenom работает только с точками в качестве разделителя на десятичные числа, а некоторые локали, такие как испанский, используют запятую в качестве десятичного разделителя.

 <?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); } 

тесты:

 ['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] 

Предостережения: не работает, если десятичная часть имеет более двух цифр.

Это реализация из этой библиотеки: https://github.com/mcuadros/currency-detector

Вам нужно будет удалить символ валюты из строки. intval остановка PHP останавливается на первом нечисловом intval он находит.

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

Хотя, если у вас есть значение, равное $100.25 , вы можете вместо этого использовать floatval .

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

PHP имеет intval ( вот документы ), который (насколько я могу судить) точно так же, как parseInt JavaScript.

Однако для того, что стоит, я не думаю, что любая функция поможет вам в том, что вы пытаетесь сделать. Поскольку первый символ не является числовым, оба уродца (PHP даст вам 0, JS даст вам NaN ). Таким образом, на любом языке вам придется выполнять синтаксический анализ строк / регулярных выражений.

Кастинг – ваш друг:

 $int = (int) $string; 

Обновление на основе op :

Попробуйте что-то вроде этого:

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

Демо: http://codepad.org/QyrfS7WE

У меня была аналогичная проблема, когда я не получил символ валюты, только строки (т. Е.: 1,234,567,89 или 1,234,567,89).

Это помогло мне нормализовать оба случая в поплавках:

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

Но ответ Гордона намного чище.

Я новичок, поэтому, вероятно, очевидный (для других, а не я) недостаток подхода ниже, но я думал, что поделюсь им. Мне было бы интересно узнать, быстрее или медленнее, чем при использовании preg_replace, но не проводил никаких тестов скорости.

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

$ dirtyString может быть массивом, поэтому:

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