PHP不使用內置函數intval(),實現字符串轉整數

平時咱們用PHP時,將字符串轉化爲整型時,通常都是使用 intval() 內置函數,那麼若是咱們本身寫,怎麼寫一個呢?函數

此時咱們能夠利用 ASCII 碼計算得整數的特性,由於每一個字符都對應一個 ASCII 碼,當對這個字符作加減乘除的時候,實際上就是對ASCII 碼作加減乘除操做,也就是整型操做,最終會返回一個整型數字。spa

也就是說:
'1' - '0' = 1;
'2' - '0' = 2;code

數字0~9對應的十進制ASCII碼爲:blog

數字 ASCII值
0 48 1 49 2 50 3 51 4 52 5 53 6 54 7 55 8 56 9 57

相似intval()函數的實現方法爲:字符串

//自定義字符串轉int
function myIntval ($str = '')
{
    $len = strlen($str);
    $int = 0;
    $negative = false;//是不是負數
    for ($i = 0; $i < $len; $i++) {
        //第一位字符判斷 正負
        if ($i == 0) {
            if ($str[$i] == '-') {
                $negative = true;
                continue;
            }
        }
        //判斷字符是否是數字的ASCII碼範圍
        if ($str[$i] < '0' || $str[$i] > '9') {
            break;
        }

        $int *= 10;
        $num = $str[$i] - '0';//減去0的ASCII碼就是數字自己[int類型]
        $int = $int + $num;
    }
    $int = $negative === true ? -$int : $int;
    return $int;
}

var_dump(myIntval('-1tt01t34t')); //輸出: int(-1)
var_dump(myIntval('-tt01t34t')); //輸出: int(0)
var_dump(myIntval('tt01t34t')); //輸出: int(0)
var_dump(myIntval('01t34t')); //輸出: int(1)
var_dump(myIntval('134t')); //輸出: int(134)

 

Note:io

Redis 中的字符串轉整型的函數也是基於ASCII相減去實現的。function

相關文章
相關標籤/搜索