\\\\)?' .'(?\d[\d\,]{4,18})' // if prefix $ did not exist, then check suffix $ .'(?(firstsign)|(?:日本)?円)' .'|' // pattern with unit(s) in English .'(?\\\\)?' .'(?:(?P\d[\d\,]{0,3}(?:\.\d+)?)\strillion)?' .'(?:(?P\d[\d\,]{0,3}(?:\.\d+)?)\sbillion)?' .'(?:(?P\d[\d]{0,3}(?:\.\d+)?)\smillion)?' .'(?:(?P\d[\d]{0,3}(?:\.\d+)?)\sthousand)?' .'(?\d[\d]{0,3}(?:\.\d+)?)?' // if prefix $ did not exist, then check suffix $ .'(?(firstsign2)|(?:\sJapanese)?\syens?)' .'|' // pattern with unit(s) in Japanese .'(?\\\\)?' .'(?:(?P\d[\d\,]{0,3}(?:\.\d+)?)兆)?' .'(?:(?P\d[\d]{0,3}(?:\.\d+)?)億)?' .'(?:(?P\d[\d]{0,3}(?:\.\d+)?)万)?' .'(?\d[\d]{0,3}(?:\.\d+)?)?' // if prefix $ did not exist, then check suffix $ .'(?(firstsign3)|(?:日本)?円)' .')/i', array(&$this, 'processNumber'), $text, -1, $count ); return $results; } /** * normalized units with absolute amount of money * * case 1: * @assert (array("yen1"=>"12,345")) == "12345" * * case 2: * @assert (array("trillion"=>"3")) == "3000000000000" * @assert (array("billion"=>"1","million"=>30,"yen2"=>600)) == "1030000600" * @assert (array("million"=>1)) == "1000000" * @assert (array("thousand"=>12,"yen2"=>500)) == "12500" * * case 3: * @assert (array("chou"=>"","oku"=>48,"man"=>6000)) == "4860000000" * @assert (array("chou"=>1,"oku"=>2,"man"=>3,"yen3"=>4)) == "1000200030004" * @assert (array("chou"=>12,"oku"=>3000)) == "12300000000000" * @assert (array("chou"=>12,"man"=>500)) == "12000005000000" * @assert (array("yen3"=>"6.99")) == "6" * @assert (array("man"=>2.7)) == "27000" * @assert (array("oku"=>168)) == "16800000000" */ public function normalize($numbers) { $amount = 0; foreach($numbers as $key => $value) { $value = str_replace(',', '', $value); switch((string)$key) { // cast for sure as the array may have other key/values case 'trillion': $amount += (float)$value * 1000 * 1000 * 1000 * 1000; break; case 'billion': $amount += (float)$value * 1000 * 1000 * 1000; break; case 'million': $amount += (float)$value * 1000 * 1000; break; case 'thousand': $amount += (float)$value * 1000; break; case 'chou': $amount += (float)$value * 10000 * 10000 * 10000; break; case 'oku': $amount += (float)$value * 10000 * 10000; break; case 'man': $amount += (float)$value * 10000; break; case 'yen1': case 'yen2': case 'yen3': $amount += (int)$value; break; default: } } return $amount; } }