3

文字列を float に変換したいのですが、問題があります。これが私のコードです

    $dataValue = $item[$data];
    $dataValue = trim($dataValue);
    var_dump($dataValue);echo "<br>";
    $dataValue = str_replace(',', '.', $dataValue);
    var_dump($dataValue);echo "<br>";
    var_dump(floatval($dataValue));echo "<br>";
    var_dump(floatval('4.02'));echo "<br>";

そして結果

string(7) "4,02"
string(7) "4.02"
float(4)
float(4.02)

3 番目の結果がわかりません。なぜ 4.02 ではなく 4 なのですか?

ありがとう

編集:

私の新しいコード:

$dataValue = $item[$data];

        echo mb_detect_encoding($dataValue) . "<br>";

        $dataValue = iconv('ASCII', 'UTF-8//TRANSLIT', $dataValue);
        $dataValue = trim($dataValue);
        $dataValue = str_replace(',', '.', $dataValue);

        echo mb_detect_encoding($dataValue) . "<br>";

        var_dump($dataValue);echo"<br >";
        $dataValue = mb_convert_encoding($dataValue, "UTF-8");
        var_dump($dataValue);echo"<br >";
        $dataValue = str_replace(',', '.', $dataValue);
        $dataValue = floatval($dataValue);
        var_dump($dataValue);echo"<br >";`

そして結果

ASCII
ASCII
string(7) "4.02"
string(7) "4.02"
float(4)
4

5 に答える 5

5

目に見える文字は 4 つしかありませんvar_dump()が、7 つあると主張していfloatval()ます。これは、 の内容の 16 進ダンプを見ることで確認できます$dataValue

編集:

文字列が UTF-16LE でエンコードされているようです。mb または iconv を使用して、処理前に ASCII/UTF-8 に変換します。

于 2013-01-16T18:30:59.367 に答える
0

number_format(float_number、decimal_places)を使用します。

var_dump(number_format(floatval($dataValue) ,2));
于 2013-01-16T18:26:12.550 に答える
0

違いは、$ dataValueが3番目の出力では二重引用符で囲まれた文字列であるのに対し、4番目の例では一重引用符で囲まれた文字列を使用するという高速性にあると思います。PHPでは、リテラルとして扱われる方法を処理する場合、これらの動作は異なります。

于 2013-01-16T18:26:14.183 に答える
0

PHPのfloat実装の精度の問題に関係していると思います。

これをチェックしてください:ウィキペディア:浮動小数点精度の問題

于 2013-01-16T18:26:35.270 に答える
0

これをテストしました:

$dataValue = "4,02";
$dataValue = trim($dataValue);
var_dump($dataValue);echo "<br>";
$dataValue = str_replace(',', '.', $dataValue);
var_dump($dataValue);echo "<br>";
var_dump(floatval($dataValue));echo "<br>";
var_dump(floatval('4.02'));echo "<br>";

出力:

string(4) "4,02"
string(4) "4.02"
float(4.02)
float(4.02) 

投稿されたコードが説明されている問題を引き起こすと確信していますか?

編集

これを追加してみてください:

$dataValue = preg_replace("/[^0-9\,]/", '', $dataValue);
于 2013-01-16T18:25:05.330 に答える