我有一个货币值,如下所示,
$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 billion
或6 billion
。
如何处理所有情况并将结果存储在我需要的三个变量中?
同样如何处理£(67.1) million (2011)[1]
HK $ 648 million (2006)
22,440,000, 1,325.26 crore (US$241.2 million) [4].
?
我正在考虑一个蛮力解决方案来逐个处理每个案例。 但这不是一个合适的。
有没有最简单的方法呢?
任何帮助都会受到赞赏吗?
答案 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);
}