14

整数が整数かどうかをテストする関数を探しています。これまでのところ私はこれを持っています:

if (is_numeric($answer3)) {
    echo "Is triangular\n";
} else {
    echo "Is not triangular\n";
}

ただし、$ answer3が小数の場合でも、これは常に「三角形です」を返します。

整数をテストして、小数があるかどうかを確認するにはどうすればよいですか?

4

10 に答える 10

17

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 )
于 2012-06-14T21:31:55.463 に答える
15

10.0整数または浮動小数点数と見なす必要がありますか? 整数の場合、探しているものfmod():

if (fmod($number, 1) == 0) // $number DOES NOT have a significant decimal part
{
    // is whole number
}

そうでなければ、is_int()十分です。


編集:重要でない小数部分をチェックする別の方法は次のとおりです。

if (round($number, 0) == $number)
{
    // is whole number
}
于 2012-06-14T21:31:07.040 に答える
4
  • is_int整数型にする必要がある場合は、
  • ctype_digit文字列をテストする場合、
  • filter_var($input,FILTER_VALIDATE_INT)すべてのために。

そしてマニュアルを検索

于 2012-06-14T21:32:19.773 に答える
2

多分これは最もエレガントなソリューションです:

if ( $answer3 != (int) ( $answer3 ) ) {
于 2015-07-27T15:12:18.963 に答える
1

$answer3 が文字列でない場合は、次を使用してみてください。

is_float()

が単なる数値ではなく浮動小数点値であるかどうかを確認します。

于 2012-06-14T21:29:33.687 に答える
1

すべての回答を確認しましたが、フローティング部分を確認しようとしているものはほとんどありませんでした。これは正しい方法ですが、等号を使用して浮動小数点数を比較することはお勧めできません。最善の解決策は次のとおりです。

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
于 2017-08-07T12:02:06.483 に答える
1

この関数は、投入するすべての入力に対して 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

この記事で説明したように、この値はおかしなことを行い、私の関数でも失敗します。これは、 と にキャストするintfloat、合計で異なる値が得られるためです。だから準備してください!

(int)'8e2bottles' // 8
(float)'8e2bottles' // 800.0
于 2016-08-24T10:18:34.137 に答える
0

私はこれに完全に慣れていませんが、PHPで数値が浮動小数か整数かを確認する最良の方法は、単純な確認によるものであることがわかりました。

if ($number == round($number)) { } else { }

それが本当に整数であれば、それは等しくなります。

于 2017-09-15T11:01:41.747 に答える