Разобрать валюту из строки

Я хочу проанализировать валюту из строки в PHP, я просмотрел программу форматирования чисел, но у меня нет PHP 5.3 или возможности добавлять расширения.

Валюта будет существовать только один раз для каждой строки и будет иметь префикс символа валюты, в моем случае знак фунта £. Валюта может быть в одном из следующих форматов:

£0.90
£100
£100.10
£1000

Каким будет лучший способ добиться этого?

Изменить

Вот пример строки:

Paid a bill £153.93

Я хочу получить значение валюты в переменной.


person Ben Everard    schedule 20.02.2011    source источник
comment
Просто чтобы проверить, вы хотите извлечь число из строки?   -  person Dave Child    schedule 20.02.2011
comment
Да, я отредактирую немного больше информации :-)   -  person Ben Everard    schedule 20.02.2011


Ответы (5)


(float)substr($input, strpos($input, "£")+1);

Это даст вам следующие результаты:

float(0.9)
float(100)
float(100.1)
float(1000)
float(153.93)

EDIT: обновлено, чтобы отразить изменение вопроса. это предполагает, что все строки подобны той, которую вы привели в качестве примера.

person Alec Gorge    schedule 20.02.2011
comment
Преимущество этого решения по сравнению с регулярным выражением заключается в том, что у вас будет фактическое число для расчетов. - person Adrian Gonzales; 20.02.2011
comment
Кроме того, предложение, если он собирается работать с денежными значениями или хранить их, он должен работать с ними / хранить их как целые числа, конечно, умножая на 100 и приводя его к int (на всякий случай), по существу работая в количестве копеек (или какая-то другая базовая единица в британской валюте, пенсы?), затем конвертируйте их обратно в фунты с плавающей запятой для отображения, чтобы обойти потенциальную неточность вычислений с плавающей запятой. - person Phoenix; 21.02.2011
comment
Да, это выглядит хорошо, но я думаю, что у меня проблема с кодировкой знака £... - person Ben Everard; 21.02.2011
comment
Не работает, вероятно, проблема с кодировкой, потому что + 2 исправляет это. - person malhal; 16.12.2015

У меня есть другой ответ. Это может быть немного быстрее, чем использование strpos, и было бы лучше, если бы во входных данных была возможность пробелов.

$input = "£250.75";
$output = floatval(ltrim($input,"£"));
echo $output;
250.75

Вы также можете добавить другие валюты в список символов в ltrim:

$output = floatval(ltrim($input,"£$¢"));

Это удалит $, £ или ¢ с левой стороны вашего числа, а также пробелы, что нарушит решение выше, использующее strpos. Кроме того, это дало бы тот же результат, если бы в некоторых случаях не отображался символ валюты.

person cmpreshn    schedule 26.09.2012
comment
это должен быть лучший ответ - person malhal; 16.12.2015

preg_match('/(?<=£)(?=[\d.]*\d)(\d*(?:\.\d*)?)/', $input, $matches);

найдет совпадение в любом из следующих:

  • £.10
  • £0.10
  • £100
  • £100.00

и т. д.

person Ωmega    schedule 26.09.2012

Вы можете сделать это с помощью регулярного выражения ($matches[1] будет иметь ваше значение):

preg_match('/£([0-9]+|[0-9]+\.?[0-9]{2})/', $text, $matches);
person Dave Child    schedule 20.02.2011
comment
вам наверняка не нужно регулярное выражение для этого - person Alec Gorge; 20.02.2011
comment
Насколько я понимаю, он хочет извлечь число из большей строки (но оно может появиться в одной из нескольких форм в этой строке), например, вычитая 123,45 из этого комментария, содержащего 123,45 фунта стерлингов. - person Dave Child; 20.02.2011

person    schedule
comment
Почему strlen($input) - 1, функция substr всегда достигает длины строки th, длина необязательна - person Marco Demaio; 17.05.2012