web-dev-qa-db-ja.com

カンマを小数点とする数値を浮動小数点数に変換する

価格のリストに小数点のコンマと千の区切り記号としてのドットがあります。

いくつかの例:

12,30
116,10
1.563,14

これらは、サードパーティからこの形式で提供されます。それらをフロートに変換し、一緒に追加したいです。

これを行う最良の方法は何ですか? number_formatはこのフォーマットでは機能しないようです。str_replaceは、やり過ぎだと思われます。

より良い方法はありますか?ありがとう。

58
Aine

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集約的な方法ではなく、奇妙な機能を使用してそれを行う場合でも、これは内部で行うことです。

96
Teekin

PHP5.3以降を使用している場合は、 numfmt_parse を使用して「a reverse number_format」を実行できます。そうでない場合は、発生をpreg_replace/str_replaceで置き換えることに固執します。

16
Björn

NumberFormatterクラスparseメソッド とともに使用できます。

11
Gumbo

この関数は、小数としてドットまたはコンマを使用した数値と互換性があります

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
8
Ramon

それらがファイルまたは配列にあると仮定すると、単にバッチとして置き換えます(つまり、一度にすべて):

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

pHPの緩やかに型付けされた性質を最大限に活用して、そこから数値を処理します。

7
Paul Norman

過度に見えるかもしれませんが、ロケールに関係なく、指定されたフォーマットを変換します。

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
6
Adrian Piechota

from PHP manual:

str_replace —検索文字列のすべての出現を置換文字列で置き換えます

そのルートを下って、文字列から浮動小数点数に変換します- floatval

2
Yishai Landau