整数が整数かどうかをテストする関数を探しています。これまでのところ私はこれを持っています:
if (is_numeric($answer3)) {
echo "Is triangular\n";
} else {
echo "Is not triangular\n";
}
ただし、$ answer3が小数の場合でも、これは常に「三角形です」を返します。
整数をテストして、小数があるかどうかを確認するにはどうすればよいですか?
整数が整数かどうかをテストする関数を探しています。これまでのところ私はこれを持っています:
if (is_numeric($answer3)) {
echo "Is triangular\n";
} else {
echo "Is not triangular\n";
}
ただし、$ answer3が小数の場合でも、これは常に「三角形です」を返します。
整数をテストして、小数があるかどうかを確認するにはどうすればよいですか?
is_numericは、浮動小数点数が数値であることを考慮して、浮動小数点数に対しても true を返します。
指定された変数が数値かどうかを調べます。数値文字列は、オプションの符号、任意の桁数、オプションの小数部、およびオプションの指数部で構成されます。したがって、+0123.45e6 は有効な数値です。16 進数表記 (0xFF) も使用できますが、符号、10 進数、および指数部分は使用できません。
is_float() を試すことができますが、入力が文字列の場合は機能しません。
var_dump( is_float( '23.5' ) ); // return false
したがって、数値の文字列表現を扱っている場合は、.
if ( strpos( $answer3, '.' ) === false )
必要に応じて is_numeric を追加できます
// Make sure its numeric and has no decimal point
if ( is_numeric( $answer3 ) && strpos( $answer3, '.' ) === false )
is_int
整数型にする必要がある場合は、ctype_digit
文字列をテストする場合、filter_var($input,FILTER_VALIDATE_INT)
すべてのために。そしてマニュアルを検索
多分これは最もエレガントなソリューションです:
if ( $answer3 != (int) ( $answer3 ) ) {
$answer3 が文字列でない場合は、次を使用してみてください。
is_float()
が単なる数値ではなく浮動小数点値であるかどうかを確認します。
すべての回答を確認しましたが、フローティング部分を確認しようとしているものはほとんどありませんでした。これは正しい方法ですが、等号を使用して浮動小数点数を比較することはお勧めできません。最善の解決策は次のとおりです。
function isIntegerNumber($number){
$floor = floor($number);
$fract = abs($number - $floor);
return is_numeric($number) && $fract < 1e-16;
}
echo var_export(isIntegerNumber("10X"), true).PHP_EOL;
echo var_export(isIntegerNumber("3.0001"), true).PHP_EOL;
echo var_export(isIntegerNumber("-23.0001"), true).PHP_EOL;
echo var_export(isIntegerNumber(-10.01), true).PHP_EOL;
echo var_export(isIntegerNumber("3.00"), true).PHP_EOL;
echo var_export(isIntegerNumber("-23.00"), true).PHP_EOL;
echo var_export(isIntegerNumber(-10.00), true).PHP_EOL;
echo var_export(isIntegerNumber(5), true).PHP_EOL;
echo var_export(isIntegerNumber(-5), true).PHP_EOL;
$tricky = (0.1+0.7)*10.0;
echo "now something a bit tricky: ".PHP_EOL;
echo "(0.1+0.7)*10.0 = ".var_export($tricky, true) .' (type: "'.gettype($tricky).'")'.PHP_EOL;
echo 'is it int: '.var_export(isIntegerNumber($tricky), true).PHP_EOL;
echo 'is it 8: '.var_export($tricky == 8, true).PHP_EOL;
結果:
false
false
false
false
true
true
true
true
true
now something a bit tricky:
(0.1+0.7)*10.0 = 7.9999999999999991 (type: "double")
is it int: false
is it 8: false
この関数は、投入するすべての入力に対して 99% の時間ジョブを実行します。
function($number) {
(float)(int)$number == (float)$number;
}
注: (float) にキャストする場合、両方が常に同じ型であるため、ここでは厳密な比較は必要ありません。
値を比較するときのPHP の狂気に関するこの記事に触発されて、次の入力について少しテストを実行しました。
予想通り
これらの値には小数部分がありません。
1.0 // TRUE
'1.0' // TRUE
true // TRUE
false // TRUE
'true' // TRUE
'false' // TRUE
10e3 // TRUE
0123 // TRUE
null // TRUE
'test' // TRUE
1 // TRUE
0 // TRUE
1.2e3 // TRUE
0xfe // TRUE
0b0 // TRUE
0b1 // TRUE
b0 // TRUE
b1 // TRUE
-0xfe // TRUE
'' // TRUE
'8bottles' // TRUE
'8.0bottles' // TRUE
'0foo' // TRUE
array() // TRUE
'0x12foo' // TRUE
'0123' // TRUE
'0xfe' // TRUE
new Object // TRUE
これらの値には小数部分があります。
'1.1' // FALSE
1.1 // FALSE
10e-3 // FALSE
.9 // FALSE
0.9 // FALSE
.1 // FALSE
0.1 // FALSE
0123.2 // FALSE
7E-10 // FALSE
1.2e-3 // FALSE
期待できません:
'8e2bottles' // FALSE
この記事で説明したように、この値はおかしなことを行い、私の関数でも失敗します。これは、 と にキャストするint
とfloat
、合計で異なる値が得られるためです。だから準備してください!
(int)'8e2bottles' // 8
(float)'8e2bottles' // 800.0
私はこれに完全に慣れていませんが、PHPで数値が浮動小数か整数かを確認する最良の方法は、単純な確認によるものであることがわかりました。
if ($number == round($number)) { } else { }
それが本当に整数であれば、それは等しくなります。