Возможный дубликат:
PHP: unformat money
Как избавиться от всего, что не является числом или точкой, заменяя .
используя регулярное выражение?
Примеры:
$50.45 = 50.45 USD 50.45 = 50.45 50,45 = 50.45 USD$ 50.45 = 50.45
<?php $money = array( '$50.45', 'USD 50.45', '50,45', 'USD$ 50.45' ); // remove everything except a digit "0-9", a comma ",", and a dot "." $money = preg_replace('/[^\d,\.]/', '', $money); // replace the comma with a dot, in the number format ",12" or ",43" $money = preg_replace('/,(\d{2})$/', '.$1', $money); print_r($money); ?>
Вывод:
Array ( [0] => 50.45 [1] => 50.45 [2] => 50.45 [3] => 50.45 )
preg_replace('/.*?(\d+)(?:[.,](\d+))?.*/', '\1.\2', $string);
Решение, которое я придумал, работает с вашими примерами:
preg_replace("([^0-9\.])","",str_replace(",",".",$val));
Предполагая, что запятая появляется только когда она должна быть десятичной точкой, а не быть разделителем тысяч. Он заменяет их десятичным разрядом, а затем удаляет все нецифровые / десятичные символы из оставшейся строки в целом.
Тестовый скрипт:
$inputs = array("\$50.45", "USD 50.45", "50,45", "USD\$ 50.45"); foreach ($inputs as $val) { $cleanVal = preg_replace("([^0-9\.])","",str_replace(",",".",$val)); echo "GIVEN: <b>".$val."</b> -> CLEAN: <b>".$cleanVal."</b><br/>"; }
Вывод:
ДАЛЕЕ: $ 50,45 -> ЧИСТЫЙ: 50,45
ДАЛЕЕ: 50,45 долларов США -> ЧИСТЫЙ: 50,45
ДАЛЕЕ: 50,45 -> ЧИСТЫЙ: 50,45
ДАЛЕЕ: 50,45 долларов США -> ЧИСТЫЙ: 50,45
Это тоже сработало бы для приведенных примеров ( demo ):
$money = array( '$50.45', 'USD 50.45', '50,45', 'USD$ 50.45' ); foreach ($money as $val) { echo filter_var( str_replace(',', '.', $val), FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION ), PHP_EOL; } // gives // 50.45 // 50.45 // 50.45 // 50.45
Это приведет к сбою, когда строка содержит дроби и тысячи разделителей. Существует флаг фильтра FILTER_FLAG_ALLOW_THOUSAND
который также может обрабатывать тысячи разделителей. Но поскольку тысячи разделителей могут указывать долю в других локалях, и вы хотите принять ее во внимание, она не будет работать в вашем сценарии.
Для более эффективного альтернативного анализа попробуйте
Простой пример можно найти в PHP: unformat money . Код примера в принятом ответе будет обрабатывать только $ 50.45. Функция NumberFormatter может быть настроена с дополнительными правилами, поэтому, хотя я не уверен на 100%, я думаю, что с ней возможно.