我必须读取一个相当大的文件,其中包含以不同方式格式化的数字。
我尝试过使用内置的floatval()函数。此函数适用于某些数字,例如22000.76
,但不适用于22000,76
。
阅读php.net上的评论对我帮助很大,我发现了这个parseFloat函数:
<?php
function parseFloat($ptString) {
if (strlen($ptString) == 0) {
return false;
}
$pString = str_replace(" ", "", $ptString);
if (substr_count($pString, ",") > 1)
$pString = str_replace(",", "", $pString);
if (substr_count($pString, ".") > 1)
$pString = str_replace(".", "", $pString);
$pregResult = array();
$commaset = strpos($pString,',');
if ($commaset === false) {$commaset = -1;}
$pointset = strpos($pString,'.');
if ($pointset === false) {$pointset = -1;}
$pregResultA = array();
$pregResultB = array();
if ($pointset < $commaset) {
preg_match('#(([-]?[0-9]+('.[0-9])?)+(,[0-9]+)?)#', $pString, $pregResultA);
}
preg_match('#(([-]?[0-9]+(,[0-9])?)+('.[0-9]+)?)#', $pString, $pregResultB);
if ((isset($pregResultA[0]) && (!isset($pregResultB[0])
|| strstr($preResultA[0],$pregResultB[0]) == 0
|| !$pointset))) {
$numberString = $pregResultA[0];
$numberString = str_replace('.','',$numberString);
$numberString = str_replace(',','.',$numberString);
}
elseif (isset($pregResultB[0]) && (!isset($pregResultA[0])
|| strstr($pregResultB[0],$preResultA[0]) == 0
|| !$commaset)) {
$numberString = $pregResultB[0];
$numberString = str_replace(',','',$numberString);
}
else {
return false;
}
$result = (float)$numberString;
return $result;
}
?>
它几乎适用于我列表中的所有数字。由于我使用DKK作为货币,一些数字的格式如下:Kr. 100.00
。我只需将这些行放在parseFloat函数的顶部就解决了这个问题。
$prefix = substr($ptString, 0, 4);
if ($prefix == "kr. " || $prefix == "Kr. ")
$ptString = substr($ptString,4);
$prefix = substr($ptString, 0, 3);
if ($prefix == "Kr." || $prefix == "kr.")
$ptString = substr($ptString,3);
现在我的问题只出现在数字上,格式像12.123.00
,应该是12123.00
我认为这可以用正则表达式解决(不是我的强项)。
基本上,我要求将xx.xxx.dd转换为xxxxx.dd。
不要考虑舍入问题。
NumberFormatter
有一个可能有用的parseCurrency()
方法。
如果所有的问题都是从xx.xxx.dd转换为xxxxx.dd,则无需使用regexp引擎,只需使用explode()函数即可,例如:
$n = "123.456.78";
$a = explode(".", $n);
if(sizeof($a)==3) //had more than one dot
$n = $a[0].$a[1].".".$a[2];
//$n now is 123456.78
如果数字总是有小数(便士、美分等)。。试试这个破解:
$value = (float)preg_replace('/'D/', '', $strToParse)/100;