数字の入ったかなり大きなファイルを別の方法でフォーマットする必要があります。金額の書式設定された文字列を浮動小数点数に変換する
私は組み込みの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);
今私の問題は、私はこれは正規表現(ない私の強さ)で解決することができると思い12123.00
にする必要があります。この12.123.00
のようにフォーマットされた番号、発生します。
基本的には、xx.xxx.ddをxxxxx.ddに変換するよう求めています。
丸めの問題については考えないでください。
通貨を格納するために浮動小数点を使用しないでください。あなたは丸めの問題に終わるでしょう。 100を掛けて、それをいくつかのセントとして保存する方がよい。 – Spudley
PHP 5.3をお使いの場合は、['NumberFormatter :: parseCurrency'](http://php.net/manual/en/numberformatter.parsecurrency.php) –
@ Spudleyを試すことができます。丸めの問題は考慮されていません。これは重要ではありません。 – Ragnar123