Неформатировать деньги при разборе в PHP
45979 просмотра
8 ответа
Есть ли способ получить значение с плавающей запятой строки, как это:, 75,25 €
кроме parsefloat(str_replace(',', '.', $var))
?
Я хочу, чтобы это зависело от текущего языка сайта, и иногда запятую можно заменить точкой.
Автор: cili Источник Размещён: 12.11.2019 09:30Ответы (8)
43 плюса
Вы можете использовать
Пример из руководства:
$formatter = new NumberFormatter('de_DE', NumberFormatter::CURRENCY);
var_dump($formatter->parseCurrency("75,25 €", $curr));
дает: float(75.25)
Обратите внимание, что расширение intl не включено по умолчанию. Пожалуйста, обратитесь к инструкции по установке .
Автор: Gordon Размещён: 28.02.2011 09:1745 плюса
Это более сложное / медленное решение, но оно работает со всеми локалями. Решение @ 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
Автор: mcuadros Размещён: 04.11.2013 09:2242 плюса
использовать 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
Так что у вас есть это. одна строка, одна замена. ты в порядке
Автор: rlemon Размещён: 13.09.2011 08:279 плюса
Вам нужно удалить символ валюты из строки. PHP intval
останавливается на первом нечисловом символе, который он находит.
$int = intval(preg_replace('/[^\d\.]/', '', '$100')); // 100
Хотя, если у вас есть значение как $100.25
, вы можете использовать floatval
вместо этого.
$float = floatval(preg_replace('/[^\d\.]/', '', '$100.25')); // 100.25
Автор: Rocket Hazmat
Размещён: 13.09.2011 08:26
2 плюса
У PHP есть intval
( вот документы ), который (насколько я могу судить) точно такой же, как у JavaScript parseInt
.
Тем не менее, ни за что не думаю, что любая из этих функций поможет вам в том, что вы пытаетесь сделать. Поскольку первый символ не числовой, оба сходят с ума (PHP даст вам 0, JS даст вам NaN
). Таким образом, на любом языке вам придется выполнять синтаксический анализ строк / регулярных выражений.
1 плюс
Кастинг твой друг
$int = (int) $string;
Обновление на основе оп :
Попробуйте что-то вроде этого:
<?php
function extract_numbers($string)
{
return preg_replace("/[^0-9]/", '', $string);
}
echo extract_numbers('$100');
?>
Демо: http://codepad.org/QyrfS7WE
Автор: Neal Размещён: 13.09.2011 08:211 плюс
У меня была похожая проблема, когда я не получил символ валюты, только строки (то есть: 1 234 567,89 или 1,234,567,89).
Это помогло мне нормализовать оба случая в поплавки:
$val = str_replace(",", ".", $formatted);
$val = preg_replace("/[\,\.](\d{3})/", "$1", $val);
Но ответ Гордона намного чище.
Автор: Edson Medina Размещён: 27.03.2012 06:401 плюс
Я новичок, так что, вероятно, есть очевидная (для других, а не для меня) обратная сторона подхода, описанного ниже, но я решил, что в любом случае поделюсь им. Мне было бы интересно узнать, работает ли он быстрее или медленнее, чем использование 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);
Автор: user2840024
Размещён: 02.10.2013 07:19
Вопросы из категории :
- php Как вы отлаживаете PHP-скрипты?
- php Заставьте XAMPP / Apache обслуживать файл вне htdocs
- php Как включить файлы PHP, которые требуют абсолютного пути?
- php Скрипт входа со скрытыми кнопками
- php How can I find unused functions in a PHP project
- parsing Как вручную проанализировать число с плавающей запятой из строки
- parsing Какой лучший способ прочитать и проанализировать большой текстовый файл по сети?
- parsing Каков наилучший способ для анализа времени в объект Date из пользовательского ввода в Javascript?
- parsing SQL: parse the first, middle and last name from a fullname field
- parsing Какой самый простой способ для анализа файла INI в Java?
- floating-point Преобразовать десятичную в двойную?
- floating-point Плавающая / двойная точность в режимах отладки / выпуска
- floating-point Сохраняйте точность с двойным в Java
- floating-point Насколько детерминистична погрешность с плавающей запятой?
- currency Как я могу отформатировать числа в виде строки валюты в JavaScript?
- currency Должен ли я использовать NSDecimalNumber, чтобы иметь дело с деньгами?
- currency Нужен собственный формат валюты для использования с String.Format
- currency Какой тип данных лучше всего использовать для денег в C #?
- currency десятичный против двойного! - Какой я должен использовать и когда?