在PHP中将货币名称解析为整数值

时间:2012-12-27 18:29:35

标签: php regex string parsing currency

我有一个货币值,如下所示,

$6.041 billion USD (2006)US$6.041 billion (2009)[1]€6.041 billion (2010)[1]

我想以这样一种方式解析货币值,我想将其存储在三个不同的变量中,即$number, $currency, $year(即)$number = 6,041,000,000$currency = "euro"以及$year = 2010

问题是该字符串可能包含$USD。但我需要相应地解析它们。

另外,我也可能最终得到million。根据那个成功的零应该有所不同。此外,我可能会或可能不会在货币中有小数点。即6.041 billion6 billion

如何处理所有情况并将结果存储在我需要的三个变量中?

同样如何处理£(67.1) million (2011)[1] HK $ 648 million (2006) 22,440,000, 1,325.26 crore (US$241.2 million) [4].

我正在考虑一个蛮力解决方案来逐个处理每个案例。 但这不是一个合适的。

有没有最简单的方法呢?

任何帮助都会受到赞赏吗?

2 个答案:

答案 0 :(得分:0)

您可以尝试运行类似这样的正则表达式(未经测试):

if(preg_match('/([$€])([\d\.]+)\s?([\w]+)[^\(]*\((\d+)\)/',$value,$matches)){
    switch($matches[1]){
        case '$':
            $currency = 'dollar';
            break;
        case '€':
            $currency = 'euro';
            break;
        // and more for more currencies
    }
    $number = $matches[2];
    switch($matches[3]){
        case 'billion':
            $number = intval($number*1000000000);
            break;
        case 'million':
            $number = intval($number*1000000);
            break;
        // and more for more multipliers
    }
    $year = $matches[4];
}

请记住在正则表达式[$€]的第一对方括号中添加您需要支持的所有可能货币符号。

答案 1 :(得分:0)

未经测试,我确信有更优雅的方法可以做,但这应该有效:

<?php

echo parseCurrency('$6.041 billion USD (2006)');


function parseCurrency($input){
 if(strpos($input, 'USD') || strpos($input, '$')){
     $currency = 'USD';
     $floatVal = (float) get_string($input, '$', ' ');
 }
 elseif(strpos($input, '€')){
     $currency = 'EUR';
     $floatVal = (float) get_string($input, '€', ' ');
 }
 else{
     $currency = 'undefined';
     die();
 }

 if(strpos($input, 'billion'){
    $number = $floatVal * 1000000000;
 } 
 elseif(strpos($input, 'million'){
    $number = $floatVal * 1000000;
 }
 else{
    $number = 'undefined';
    die();
 }
 if (preg_match('/\\([12][0-9]{3}\\)/', $input, $years)){
    $year = $years[0];
 }
 else{
    $year = 'undefined';
    die();
 }
 return $number . ', ' . $currency . ', ' . $year;
}

//used to find million or billion
function get_string($string, $start, $end){
 $string = " ".$string;
 $pos = strpos($string,$start);
 if ($pos == 0) return "";
 $pos += strlen($start);
 $len = strpos($string,$end,$pos) - $pos;
 return substr($string,$pos,$len);
}