views:

108

answers:

2

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 charset=utf-8

Many thanks

+3  A: 

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.

R0MANARMY
NumberFormatter is not available in PHP 5.2.6
NineBerry
@NineBerry: Good call, I didn't notice documentation was for 5.3. Bah!
R0MANARMY
+1  A: 

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.

NineBerry
so sorry about for not responding. I thought i would receive an email to notify any responses. so though you guys have replied almost immediately, I came to know only today. I agree with your pattern matching for handling locales.I realized the main problem is the data itself as shown below"£30.30"€62.03The only way i could make it work was to set the currency sign to code as following array('£'=>'GBP','€'=>'EUR');
webber