Есть ли способ получить значение float такой строки: 75,25 €
, кроме parsefloat(str_replace(',', '.', $var))
?
Я хочу, чтобы это зависело от текущего языка сайта, и иногда запятая могла быть заменена точкой.
Есть ли способ получить значение float такой строки: 75,25 €
, кроме parsefloat(str_replace(',', '.', $var))
?
Я хочу, чтобы это зависело от текущего языка сайта, и иногда запятая могла быть заменена точкой.
Вы можете использовать
Пример из руководства:
$formatter = new NumberFormatter('de_DE', NumberFormatter::CURRENCY);
var_dump($formatter->parseCurrency("75,25 €", $curr));
дает: float(75.25)
Обратите внимание, что расширение intl extension по умолчанию не включено. См. Инструкции по установке.
использовать 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
Вам нужно будет удалить символ валюты из строки. PHP intval
останавливается на первом нечисловом символе, который он находит.
$int = intval(preg_replace('/[^\d\.]/', '', '$100')); // 100
Хотя, если у вас есть значение типа $100.25
, вы можете использовать floatval
вместо этого.
$float = floatval(preg_replace('/[^\d\.]/', '', '$100.25')); // 100.25
PHP имеет intval
(вот документы), который (насколько я могу судить) точно так же, как JavaScript parseInt
.
Однако, для чего я не думаю, что любая функция поможет вам в том, что вы пытаетесь сделать. Поскольку первый символ не является числовым, оба уродца (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);