开发者

split currency and amount from a string

I am importing a file which has amount with different currency signs

£12.10
$26.13
€12.50

I need to import and convert this into single currency. I am splitting the string as follows

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

Couldn't make preg_split work with PREG_SPLIT_DELIM_CAPTURE

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

I have an array of currency sign to currency code

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

I need to 1. split the string into currency sign and value - if there is a better way then what i am doing 2. map the currency sign to currency code. Not able to map with $currencySymbols[$parts[0]]

Any help will be appreciated. (PHP 5.2.6) using ch开发者_C百科arset=utf-8

Many thanks


You should probably use the NumberFormatter::parseCurrency to do this instead of regular string manipulation.

Although most of the time the currency symbol will come before the numeric value, there are some European countries where the currency symbol is written last.


You shouldn't use splitting, but pattern matching to identify the amount and the currency used. Because in some locales, the currency symbol appears before the amount, in others, it appears behind the amount. Also, in some locales, symbol and amount are separated by spaces.

The following function can be used:

   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];
   }

This is how it would be employed:

  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");

You might get a problem with the EURO sign if you have UTF-8 input. Can't check the solution there right now. Maybe someone else can help out.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜