フロートするPHP文字列


120

私はPHPにまったく詳しくないので、簡単な質問をしました。

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

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

これを出力すると、正しい値が得られます。5000請求済みのユニットと1.00価格について考えてみましょう。

今、私は費やした合計金額を表示する必要があります。これら2つを掛け合わせると機能しません(期待どおり、これらは文字列です)。

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

私は何をすべきか?

回答:


201
$rootbeer = (float) $InvoicedUnits;

あなたのためにそれをすべきです。Type-Jugglingをチェックしてください。文字列のNumbersへの変換もお読みください。


その最も単純な方法ですが、特定のデータベース構成やVARCHAR>11長さでこれを実行するときに問題が発生する場合があります。理由はまだ正確に特定されていません。
Talvi Watia

2
^ worthは、(float)が最初の桁の場合、文字列から0を削除することに注意してください

また、「11,000.00」は予想される11000.00ではなく11を出力することに注意してください
CodeJunkie

64

あなたは欲しい非ロケール対応floatval機能を

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

例:

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

4
ロケール認識について言及した功績 (float)最初のサーバーで "、"に変換し、2番目のサーバーで "、"に変換するさまざまなロケールによって引き起こされる問題を1.5時間かけて追跡しました
Dr. Gianluigi Zane Zanettini

23

ユーザーが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));

7
代わりのEREG使用プリプレグ $string=preg_replace("/[^0-9\.\-]/","",$string);
ontananza

4
はい、ereg、この機能は廃止されました。したがって、eregの代わりにpregを使用する必要があります:)
HADI

9

floatでのマークアップの処理は簡単な作業ではありません。英語/アメリカの表記では、1,000をフォーマットします46*10-2

1,000.46

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

1.000,46


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


3
現在(+3年)、PHP 5.3以降ではNumberFormatterintl拡張機能とともに使用できます
zamnuts 2013年

1
PHP 5.3は質問に回答した時点で利用可能でしたが、コメントが出るまで、同じようなことをしているライブラリが何十もあるので、この単一の関数に気づきませんでした。しかし、それらはintl拡張が持っているほどのロケールの適切なカバレッジを持っていません。よろしくお願いします。
Tobias P.

1

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

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に限定されません)


なぜこれが悪いのか/どこで失敗するのかについてのコメント
Hafenkranich

またはより高速な同様に柔軟な方法はありますか?
Hafenkranich 2017年

1
「サポートされなくなった」eフラグを使用します。それは私の推測です。
Leif

0

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

$string = "one";

$float = (float)$string;

echo $float; : ( Prints 0 )

有効な数値がない場合、パーサーは数値を返さず、エラーをスローする必要があります。(これは私のコードYMMVでキャッチしようとしている条件です)

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

$string = "one";

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

echo $float; : ( Prints nothing )

その後、変換をさらに処理する前に、文字列の有効な解析がなかったかどうかを確認してエラーを返すことができます。


0

個別に変換できない値を処理する必要がある場合は、このメソッドを使用できます。

try {
    $valueToUse = trim($stringThatMightBeNumeric) + 0;
} catch (\Throwable $th) {
    // bail here if you need to
}

0

このリンクをたどると、PHPで文字列/数値を数値/浮動小数点/ 10進数に変換する方法について詳しく知ることができます。このリンクの意味はここにあります...

方法1:number_format()関数を使用します。number_format()関数は、文字列を数値に変換するために使用されます。成功した場合はフォーマットされた数値を返し、それ以外の場合は失敗した場合にE_WARNINGを返します。

$num = "1000.314"; 

//Convert string in number using  
//number_format(), function 
echo number_format($num), "\n"; 

//Convert string in number using  
//number_format(), function 
echo number_format($num, 2); 

方法2:型キャストを使用する:型キャストでは、文字列を浮動小数点、倍精度、または整数のプリミティブ型に直接変換できます。これは、関数を使用せずに文字列を数値に変換する最良の方法です。

// Number in string format 
$num = "1000.314"; 

// Type cast using int 
echo (int)$num, "\n"; 

// Type cast using float 
echo (float)$num, "\n"; 

// Type cast using double 
echo (double)$num; 

方法3:intval()およびfloatval()関数を使用します。intval()関数とfloatval()関数を使用して、文字列をそれぞれ対応する整数値と浮動小数点値に変換することもできます。

// Number in string format 
$num = "1000.314"; 

// intval() function to convert  
// string into integer 
echo intval($num), "\n"; 

// floatval() function to convert 
// string to float 
echo floatval($num); 

方法4:0を追加するか、数学演算を実行します。文字列に0を追加して、文字列番号を整数または浮動小数点数に変換することもできます。PHPでは、数学演算を実行すると、文字列は暗黙的に整数または浮動小数点数に変換されます。

// Number into string format 
$num = "1000.314"; 

// Performing mathematical operation  
// to implicitly type conversion 
echo $num + 0, "\n"; 

// Performing mathematical operation  
// to implicitly type conversion 
echo $num + 0.0, "\n"; 

// Performing mathematical operation  
// to implicitly type conversion 
echo $num + 0.1;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.