2011-06-22 89 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! –

相關問題