从一个字符串中分离货币和金额

3

我正在导入一个文件,其中包含不同货币符号的金额

£12.10
$26.13
€12.50

我需要导入并将其转换为单一货币。我将按以下方式拆分字符串:

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

无法使用PREG_SPLIT_DELIM_CAPTURE使preg_split正常工作

$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。

谢谢!

2个回答

5

NumberFormatter在PHP 5.2.6中不可用。 - NineBerry
@NineBerry:好眼力,我没注意到文档是针对5.3的。唉! - Roman

3

您不应该使用分割,而是使用模式匹配来识别金额和货币类型。因为在某些语言环境中,货币符号出现在金额前面,在另一些语言环境中,它出现在金额后面。此外,在某些语言环境中,符号和金额之间用空格隔开。

可以使用以下函数:

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

如果您使用UTF-8输入,可能会遇到欧元符号的问题。我现在无法检查解决方案。也许其他人可以帮忙。


非常抱歉没有及时回复。我以为会收到电子邮件通知任何回复,所以虽然你们几乎立即回复了,但我直到今天才知道。我同意您的模式匹配处理语言环境的方法。我意识到主要问题在于数据本身,如下所示 "£30.30" €62.03我能让它正常工作的唯一方法是将货币符号设置为以下代码 array('£'=>'GBP','€'=>'EUR'); - webber

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接