Есть ли способ получить значение с плавающей запятой для такой строки: 75,25 €
, кроме parsefloat(str_replace(',', '.', $var))
?
Я хочу, чтобы это зависело от текущего языка сайта, а иногда запятая могла быть заменена точкой.
Есть ли способ получить значение с плавающей запятой для такой строки: 75,25 €
, кроме parsefloat(str_replace(',', '.', $var))
?
Я хочу, чтобы это зависело от текущего языка сайта, а иногда запятая могла быть заменена точкой.
Вы можете использовать
Пример из руководства:
$formatter = new NumberFormatter('de_DE', NumberFormatter::CURRENCY);
var_dump($formatter->parseCurrency("75,25 €", $curr));
дает: float(75.25)
Обратите внимание, что расширение intl не включено по умолчанию. См. Инструкции по установке.
preg_match
.
- person Gordon; 28.07.2015
$curr
в вашем примере?
- person Adam; 12.09.2016
NumberFormatter::DECIMAL
, если строка представляет собой просто сумму без символа валюты.
- person Fr0zenFyr; 26.05.2021
Это немного более сложное/медленное решение, но работает со всеми локалями. Решение @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);
$removedThousandSeparator = preg_replace('/(\.|,)(?=[0-9]{3,}$)/', '', $stringWithCommaOrDot);
return (float) str_replace(',', '.', $removedThousandSeparator);
}
Тесты:
['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.
использовать 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
Итак, у вас есть это. одна строка, одна замена. ты можешь идти.
preg_replace()
:-)
- person Bojangles; 14.09.2011
.
в регулярное выражение, иначе $100.00
будет равно 10000
.
- person Rocket Hazmat; 14.09.2011
([^0-9\.])
вместо ([^0-9\\.])
? В противном случае `\` не будет совпадать и останется в последней строке.
- person bruchowski; 02.08.2013
Function ereg_replace()
устарело.
- person lzoesch; 23.12.2016
doubleval(preg_replace("/([^0-9\-\\.])/i", "", $stringVal))
. Мой выглядит нормально или что-то не так с моим подходом?
- person Ryan; 19.02.2019
Вам нужно удалить символ валюты из строки. 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
). Итак, на любом языке вам придется выполнить синтаксический анализ строк/регулярных выражений.
Я новичок, поэтому, вероятно, у описанного ниже подхода есть очевидный (для других, а не для меня) недостаток, но я все равно решил поделиться им. Мне было бы интересно узнать, быстрее это или медленнее, чем использование 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);
Кастинг — твой друг:
$int = (int) $string;
Обновление на основе операции:
Попробуйте что-то вроде этого:
<?php
function extract_numbers($string)
{
return preg_replace("/[^0-9]/", '', $string);
}
echo extract_numbers('$100');
?>
Демонстрация: http://codepad.org/QyrfS7WE
.
в регулярное выражение, иначе $100.00
будет равно 10000
.
- person Rocket Hazmat; 14.09.2011
У меня была аналогичная проблема, когда я не получил символ валюты, а только строки (например: 1 234 567,89 или 1 234 567,89).
Это помогло мне нормализовать оба случая в числа с плавающей запятой:
$val = str_replace(",", ".", $formatted);
$val = preg_replace("/[\,\.](\d{3})/", "$1", $val);
Но ответ Гордона намного чище.