2011-06-22 2 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); 

今私の問題は、私はこれは正規表現(ない私の強さ)で解決することができると思い12123.00

にする必要があります。この12.123.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

すべてのトラブルがxxxxx.ddするxx.xxx.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は有用であるかもしれない方法を有する。

+0

私のPHPインストールで 'NumberFormatter'を持っていないので、これはオプションではありませんが、最適な解決策です。 正規表現で解決できると思いますか? – Ragnar123

1

数字は常に分数(ペンス、セント、など)を持っている場合...このハックを試してみてください。

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

ありがとうございました! –

関連する問題