2011-06-22 86 views
3

我必须读取一个相当大的文件,其中包含数字,格式不同。将钱格式化的字符串转换为浮点数

我试过使用内建的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。

不要考虑舍入问题。

+1

不要使用浮动来存储货币。你最终会遇到四舍五入的问题。最好乘以100并将其存储为几美分。 – Spudley

+1

如果你在php 5.3上,你可以尝试['NumberFormatter :: parseCurrency'](http://php.net/manual/en/numberformatter.parsecurrency.php) –

+0

@ Spudley,舍入问题不是一个考虑因素,因为这并不重要。 – Ragnar123

回答

1

如果你所有的烦恼是从xx.xxx.dd转换为xxxxx.dd,没有必要要使用正则表达式引擎,您可以使用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 
2

NumberFormatter有一个可能证明有用的parseCurrency()方法。

+0

因为我的php安装中没有'NumberFormatter',所以这不是一个选项,尽管它是最好的解决方案。 你认为它可以在正则表达式中解决吗? – Ragnar123

1

如果人物总是有分数(便士,美分,等等)..尝试这个技巧:

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

谢谢brah! –

相关问题