разделить валюту и сумму из строки

Я импортирую файл с суммой с разными знаками валюты.

£12.10
$26.13
€12.50

Мне нужно импортировать и конвертировать это в единую валюту. Я разбиваю строку следующим образом

$parts = split(' ', preg_replace("/([0-9])/", ' ${1}', $amount, 1));

Не удалось заставить preg_split работать с PREG_SPLIT_DELIM_CAPTURE.

$parts = preg_split("/\d/", $amount, 2, PREG_SPLIT_DELIM_CAPTURE);

У меня есть массив знака валюты для кода валюты

$currencySymbols = array('£'=>'GBP', '$'=>'USD','€'=>'EUR')

Мне нужно 1. разделить строку на знак валюты и значение - если есть лучший способ, то что я делаю 2. сопоставить знак валюты с кодом валюты. Невозможно сопоставить с $currencySymbols[$parts[0]]

Любая помощь будет оценена. (PHP 5.2.6) с использованием charset=utf-8

Большое спасибо


person webber    schedule 09.06.2010    source источник


Ответы (2)


Вероятно, для этого вам следует использовать NumberFormatter::parseCurrency вместо обычных манипуляций со строками. .

Хотя в большинстве случаев символ валюты стоит перед числовым значением, в некоторых европейских странах валюта символ пишется последним.

person R0MANARMY    schedule 09.06.2010
comment
NumberFormatter недоступен в PHP 5.2.6. - person NineBerry; 09.06.2010
comment
@NineBerry: Хороший звонок, я не заметил, что документация была для 5.3. Ба! - person R0MANARMY; 09.06.2010

Вы должны использовать не разделение, а сопоставление с образцом для определения суммы и используемой валюты. Потому что в некоторых регионах символ валюты появляется перед суммой, в других — после суммы. Кроме того, в некоторых локалях символ и количество разделяются пробелами.

Можно использовать следующую функцию:

   function findAmountAndCurrency($s, &$amount, &$currency){
     $re_amount="/[0-9\.]+/";
     $re_curr="/[£\$€]+/";

     preg_match($re_amount, $s, $matches);
     $amount = floatval($matches[0]);

     preg_match($re_curr, $s, $matches);
     $currency = $matches[0];
   }

Вот как это будет использоваться:

  function handle($s){
    $currencySymbols = array('£'=>'GBP', '$'=>'USD','€'=>'EUR');

    findAmountAndCurrency($s, $amount, $currency);
    echo("Amount: " . $amount . "<br/>");
    echo("Currency: " . $currency . "<br/>");
    echo("Identified Currency: " . $currencySymbols[$currency] . "<br/>");
  }

  handle("£12.10");
  handle("3.212 €");
  handle("$ 99.99");

У вас могут возникнуть проблемы со знаком EURO, если у вас есть ввод UTF-8. Не могу проверить решение там прямо сейчас. Может быть, кто-то еще может помочь.

person NineBerry    schedule 09.06.2010
comment
так что извините за то, что не ответил. Я думал, что получу электронное письмо, чтобы уведомить о любых ответах. так что, хотя вы, ребята, ответили почти сразу, я узнал только сегодня. Я согласен с вашим сопоставлением шаблонов для обработки локалей. Я понял, что основная проблема заключается в самих данных, как показано ниже. 30,30 £ 62,03 – ¬'=›'евро'); - person webber; 11.06.2010