Есть ли способ получить значение float такой строки: 75,25 €
, кроме parsefloat(str_replace(',', '.', $var))
?
Я хочу, чтобы это зависело от текущего языка сайта, и иногда запятая могла быть заменена точкой.
Вы можете использовать
NumberFormatter::parseCurrency
– NumberFormatter::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'); ?>
У меня была аналогичная проблема, когда я не получил символ валюты, только строки (т. Е.: 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);