将货币格式化的字符串转换为浮点数

时间:2011-06-22 13:02:33

标签: php regex floating-point numbers

我必须阅读一个相当大的文件,其中包含以不同方式格式化的数字。

我尝试过使用内置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。

不要考虑舍入问题。

3 个答案:

答案 0 :(得分:2)

NumberFormatterparseCurrency()方法可能会有用。

答案 1 :(得分:1)

如果数字总是有分数(便士,美分等)。试试这个黑客:

$value = (float)preg_replace('/\D/', '', $strToParse)/100;

答案 2 :(得分:1)

如果你所有麻烦都是从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