3

次のコードがあります。

<?php

function s2int($pinned_id) { 
$action="aaa";
if ( $action && is_numeric($pinned_id) && (float)$pinned_id==(int)$pinned_id) {
   /**
   * @param [string] $action is setted
   * @param [int/string as int] $pinned_id is setted
   */
echo "-chekpoint- $pinned_id\n";
    $pinned_id = (int)$pinned_id;
} 
else { echo "-passpoint- $pinned_id\n";}
return $pinned_id;
}

echo s2int("000010")."\n";
echo s2int(10.00001)."\n";
echo s2int(10)."\n";
echo s2int("10")."\n";
echo s2int("0")."\n";
echo s2int("a")."\n";
echo s2int("a10")."\n";
echo s2int("10a")."\n";
echo s2int("0x1A")."\n";
echo s2int("-100")."\n";

出力:

-chekpoint- 000010
10
-passpoint- 10.00001
10.00001
-chekpoint- 10
10
-chekpoint- 10
10
-chekpoint- 0
0
-passpoint- a
a
-passpoint- a10
a10
-passpoint- 10a
10a
-chekpoint- 0x1A
0
-chekpoint- -100
-100

期待される出力:

-chekpoint- 000010
10
-passpoint- 10.00001
10.00001
-chekpoint- 10
10
-chekpoint- 10
10
-chekpoint- 0
0
-passpoint- a
a
-passpoint- a10
a10
-passpoint- 10a
10a
-passpoint- 0x1A
0x1A
-chekpoint- -100
-100

s2int が正しい (int) 変数を返すようにし、変数を (int) に変換できない場合にアクションを実行するためのベスト プラクティスは何ですか (入力が 16 進数の場合に予期しない結果が表示されるため)。

http://codepad.org/lN84HKzV

4

2 に答える 2

2

私はfilter_var()そのために使用します:

if (false === ($x = filter_var($pinned_id, FILTER_VALIDATE_INT))) {
    echo "Could not convert $pinned_id to an integer";
}
// $x is an integer

の場合は000010、8 進数も意味する可能性があるため、あいまいでした。ただし、10 進数が必要な場合は、先頭のゼロを削除する必要があります。

$num = preg_replace('/^0+(\d+)/', '\\1', $pinned_id);
if (false === ($x = filter_var($num, FILTER_VALIDATE_INT))) {
    echo "Could not convert $pinned_id to an integer";
}
// $x is an integer

16 進数も許可する場合:

if (false === ($x = filter_var($num, FILTER_VALIDATE_INT, array(
    'flags' => FILTER_FLAG_ALLOW_HEX,
))) {
    echo "Could not convert $pinned_id to an integer";
}
// $x is an integer

編集

preg_match()次のルートに行くこともできます。

function s2int($pinned_id) { 
    echo "/$pinned_id/  ";
    if (!preg_match('/^-?\d+$/', $pinned_id)) {
        echo "Could not convert $pinned_id to an integer";
        return false;
    }
    return (int)$pinned_id;
}

これは何らかの理由でコードパッドでは実行されませんが、他のシステムでは実行されるはずです

于 2012-10-05T02:18:56.643 に答える
0
function s2int($pinned_id) {
// use regex (regular expression)
$pattern = "/[a-zA-Z.]/";
$bool = preg_match($pattern, $pinned_id);

// check if $pinned_id is without any character in the $pattern
if ( $bool == false ) {
    /**
     * @param [string] $action is setted
     * @param [int/string as int] $pinned_id is setted
     */
    echo "-chekpoint- $pinned_id<br />";
    $pinned_id = (int)$pinned_id;
} else { 
    echo "-passpoint- $pinned_id<br />";
}
    return $pinned_id;
}
于 2012-10-05T02:59:28.387 に答える