web-dev-qa-db-ja.com

PHPフロートする文字列

私はPHPに全く精通しておらず、簡単な質問がありました。

2つの変数pricePerUnitInvoicedUnitsがあります。これらを値に設定するコードは次のとおりです。

$InvoicedUnits = ((string) $InvoiceLineItem->InvoicedUnits);
$pricePerUnit = ((string) $InvoiceLineItem->PricePerUnit);

これを出力すると、正しい値が得られます。 5000請求単位と価格の1.00としましょう。

次に、使用した合計金額を表示する必要があります。これら2つを掛け合わせても機能しません(予想どおり、これらは文字列です)。

しかし、PHPで変数を解析/キャスト/変換する方法はわかりません。

私は何をすべきか?

94
John
$rootbeer = (float) $InvoicedUnits;

あなたのためにそれを行う必要があります。 Type-Juggling をご覧ください。 文字列から数値への変換 も読む必要があります。

163
Sampson

非ロケール対応floatval関数 が必要です:

float floatval(mixed $ var)-文字列のfloat値を取得します。

例:

$string = '122.34343The';
$float  = floatval($string);
echo $float; // 122.34343
52
earino

ユーザーが1,00,000を書き込むと、floatvarにエラーが表示されます。そう -

floatval(preg_replace("/[^-0-9\.]/","",$input));

これははるかに信頼できます。

使用法 :

$input = '1,03,24,23,434,500.6798633 this';
echo floatval(preg_replace("/[^-0-9\.]/","",$input));
20
HADI

Floatでマークアップを処理するのは簡単なことではありません。英語/アメリカの表記では、1000プラス46*10-2をフォーマットします。

1,000.46

しかし、ドイツではコンマとポイントを変更します:

1.000,46


これにより、多言語アプリケーションで正しい数を推測するのが非常に難しくなります。
このタスクには、Zend FrameworkのZend_Measureを使用することを強くお勧めします。このコンポーネントは、ユーザー言語によって文字列をfloatに解析します。

7
Tobias P.

この関数を使用して、あらゆる種類のテキストスタイルからfloat値をキャストします。

function parseFloat($value) {
    return floatval(preg_replace('#^([-]*[0-9\.,\' ]+?)((\.|,){1}([0-9-]{1,3}))*$#e', "str_replace(array('.', ',', \"'\", ' '), '', '\\1') . '.\\4'", $value));
}

このソリューションは、ロケール設定に依存しません。したがって、ユーザー入力の場合、ユーザーは任意の方法で浮動小数点値を入力できます。これは本当に役立ちます。あなたが英語のみのプロジェクトを持っているが、世界中の人々がそれを使用している場合、プロジェクトが浮動小数点値にカンマではなくドットを必要としていることを意識していないかもしれません。あなたはミックスでjavascriptを投げてブラウザのデフォルト設定を取得することができますが、多くの人々はまだこれらの値を英語に設定しますが、1.25ではなく1,25を入力します(特に翻訳業界、研究、ITに限定されません)

1
Hafenkranich

私はこれを行う標準的な方法で問題に直面していました:

$string = "one";

$float = (float)$string;

echo $float; : ( Prints 0 )

有効な番号がない場合、パーサーは番号を返すべきではなく、エラーをスローします。 (これは、コードYMMVでキャッチしようとしている条件です)

これを修正するために、次のことを行いました。

$string = "one";

$float = is_numeric($string) ? (float)$string : null;

echo $float; : ( Prints nothing )

その後、変換をさらに処理する前に、文字列の有効な解析がなかった場合、チェックしてエラーを返すことができます。

0
Morris Buel