Какой быстрый способ очистки денежной строки

Возможный дубликат:
PHP: unformat money

Как избавиться от всего, что не является числом или точкой, заменяя . используя регулярное выражение?

Примеры:

 $50.45 = 50.45 USD 50.45 = 50.45 50,45 = 50.45 USD$ 50.45 = 50.45 

Solutions Collecting From Web of "Какой быстрый способ очистки денежной строки"

 <?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 который также может обрабатывать тысячи разделителей. Но поскольку тысячи разделителей могут указывать долю в других локалях, и вы хотите принять ее во внимание, она не будет работать в вашем сценарии.

Для более эффективного альтернативного анализа попробуйте

  • numfmt_parse_currency – Разбирайте строку в double и валюту, используя NumberFormatter.

Простой пример можно найти в PHP: unformat money . Код примера в принятом ответе будет обрабатывать только $ 50.45. Функция NumberFormatter может быть настроена с дополнительными правилами, поэтому, хотя я не уверен на 100%, я думаю, что с ней возможно.