平时我们用PHP时,将字符串转化为整型时,一般都是使用 intval() 内置函数,那么如果我们自己写,怎么写一个呢?
此时我们可以利用 ASCII 码计算得整数的特性,因为每个字符都对应一个 ASCII 码,当对这个字符做加减乘除的时候,实际上就是对ASCII 码做加减乘除操作,也就是整型操作,最终会返回一个整型数字。
也就是说:
'1' - '0' = 1;
'2' - '0' = 2;
数字0~9对应的十进制ASCII码为:
数字 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:
Redis 中的字符串转整型的函数也是基于ASCII相减去实现的。