我必須讀取一個相當大的文件,其中包含數字,格式不同。將錢格式化的字符串轉換爲浮點數
我試過使用內建的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。
不要考慮舍入問題。
不要使用浮動來存儲貨幣。你最終會遇到四捨五入的問題。最好乘以100並將其存儲爲幾美分。 – Spudley
如果你在php 5.3上,你可以嘗試['NumberFormatter :: parseCurrency'](http://php.net/manual/en/numberformatter.parsecurrency.php) –
@ Spudley,舍入問題不是一個考慮因素,因爲這並不重要。 – Ragnar123