2010-12-01 18 views
41

私は小数点のカンマと千単位のセパレータとしての価格のリストを持っています。カンマで数字を浮動小数点に変換する

いくつかの例は:

12,30
116,10
1.563,14

これらは、第三者からこの形式で来ます。私はそれらを浮動小数点に変換して一緒に追加したいです。

これを行うにはどのような方法が最適ですか? number_formatはこのフォーマットでは動作しません。str_replaceは、それぞれの番号で一度以上それを行う必要があるので、過剰なようです。

もっと良い方法がありますか?ありがとう。

+0

あなたはドットをつぶしてから、ドットのコンマを入れ替えて浮動小数点として解析することができます。それはわずか2つです。これは決して大したことではありません。あなたがショットで何十万ものレコードをやっていない限り、 – DampeS8N

答えて

78

ドットを削除するためにstr_replace()を使用することは、過剰なものではありません。

$string_number = '1.512.523,55'; 
// NOTE: You don't really have to use floatval() here, it's just to prove that it's a legitimate float value. 
$number = floatval(str_replace(',', '.', str_replace('.', '', $string_number))); 

// At this point, $number is a "natural" float. 
print $number; 
 

これはほぼ確実にあなたがこれを行うことができ、少なくともCPU集約型の方法で、オッズは、これは、それはボンネットの下に何をするかであることを、あなたがそれを行うには、いくつかの派手な機能を使用する場合でも、ということです。

+0

ここでは、「floatval」がキーです... thx –

+1

または単に$ number = str_replace(['、'、 '。']、['。']、$ string_number)* 1.0; ' – Jeff

14

PHP5.3以上を使用している場合は、numfmt_parseを使用すると、「逆の番号形式」を使用できます。そうでない場合は、発生したものをpreg_replace/str_replaceに置き換えます。 PHPマニュアルから

+1

PECL intl> = 1.0.0 – riotera

+1

"PECL intl> = 1.0.0も必要です" いいえ、 PHP 5.3を必要とするか、またはPECL intlパッケージ1.0.0経由でインストールする必要があります。 PHP 5.3以降にはサポートが組み込まれています。 –

+0

'intl'拡張が有効かどうかを確認する必要があります。それは組み込みではなく、明示的にコンパイルされているか、別の拡張としてインストールされていなければなりません。すべてのホスティングプロバイダがPHPでインストールするわけではありません。 – cronfy

1

str_replace -

置換文字列で検索文字列のすべてのオカレンス を交換し

私はそのルートを下に移動し、フロートに文字列から変換します - floatval

4

だけ(すなわち、一度にすべての)バッチとして置き換えるか、彼らは、ファイルまたは配列であると仮定すると:

$input = str_replace(array('.', ','), array('', '.'), $input); 

して、PHPの緩く型付けされた自然を生かし、そこから数字を処理します。

2

function floatvalue($val){ 
      $val = str_replace(",",".",$val); 
      $val = preg_replace('/\.(?=.*\.)/', '', $val); 
      return floatval($val); 
} 
$number = "1.325.125,54"; 
echo floatvalue($number); // The output is 1325125.54 
$number = "1,325,125.54"; 
echo floatvalue($number); // The output is 1325125.54 
0

が過剰に見えるかもしれませんが、何の母校にロケール任意の形式を変換しません小数としてこの関数は、ドットまたはコンマと番号の互換性があります。

function normalizeDecimal($val, int $precision = 4): string 
{ 
    $input = str_replace(' ', '', $val); 
    $number = str_replace(',', '.', $input); 
    if (strpos($number, '.')) { 
     $groups = explode('.', str_replace(',', '.', $number)); 
     $lastGroup = array_pop($groups); 
     $number = implode('', $groups) . '.' . $lastGroup; 
    } 
    return bcadd($number, 0, $precision); 
} 

出力:

.12   -> 0.1200 
123   -> 123.0000 
123.91  -> 12345678.9100 
123 456 78.91 -> 12345678.9100 
123,456,78.91 -> 12345678.9100 
123.456.78,91 -> 12345678.9100 
123 456 78,91 -> 12345678.9100 
関連する問題