在PHP中将货币名称解析为整数值
我有一个货币值,如下所示在PHP中将货币名称解析为整数值,php,regex,string,parsing,currency,Php,Regex,String,Parsing,Currency,我有一个货币值,如下所示 60.41亿美元(2006年)或60.41亿美元(2009年)[1]或60.41亿欧元(2010年)[1] 我希望以这样一种方式解析货币值,即将其存储在三个不同的变量中,即$number、$currency、$year(即$number=6041000000和$currency=“euro”和$year=2010) 问题是字符串可能有€或$或USD。但我需要相应地解析它们 此外,我可能最终也会拥有1000000。根据这一点,后面的零应该是不同的。此外,货币中可能有小数点
60.41亿美元(2006年)
或60.41亿美元(2009年)[1]
或60.41亿欧元(2010年)[1]
我希望以这样一种方式解析货币值,即将其存储在三个不同的变量中,即$number、$currency、$year
(即$number=6041000000
和$currency=“euro”
和$year=2010
)
问题是字符串可能有€
或$
或USD
。但我需要相应地解析它们
此外,我可能最终也会拥有1000000
。根据这一点,后面的零应该是不同的。此外,货币中可能有小数点,也可能没有小数点。i、 e60.41亿
或60亿
如何处理所有案例并将结果存储在我需要的三个变量中
同样,如何处理6710万英镑(2011)[1]6.48亿港元(2006)
22440000,132526亿欧元(2.412亿美元)[4]。
我正在考虑一个暴力解决方案,一个接一个地处理每个案件。
但这并不合适
有什么最简单的方法可以做到这一点吗
如有任何帮助,将不胜感激。您可以尝试运行以下类似的正则表达式(未经测试):
请记住在正则表达式的第一对方括号中添加您需要支持的所有可能的货币符号 未经测试,我相信还有更优雅的方式,但这应该是可行的:
<?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);
}
我在解析时遇到困难,因为我的示例货币值如下。。(6710)百万英镑(2011年)[1],6.48亿港元(2006年),22440000,132526亿雷亚尔(2.412亿美元)[4]。如何处理所有案件。如果我们有年份,我希望设置年份,否则它应该是空的。你应该确保你的问题包括所有可能的变化。如果没有所有信息,没有人可以设计正则表达式来帮助您。
<?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);
}