PHP不使用内置函数实现字符串转整型的方法示例


Posted in PHP onJuly 03, 2017

介绍

php字符串类型的数字如果想转成整型的数字,一般我们都是采用系统内置的API去做转换,但如果规定就不让我们去用系统内置的API转换,而是让自己去实现一个函数转换该怎么办?这里我们看下如何去实现。

系统内置 API 方式

$num = '345432123';

 //(一)
$num = (int)$num;
//输出:
//int(345432123)

//(二)
$num = intval($num);
//输出:
//int(345432123)

采用 ASCII 码方式

下面我们利用 ascii 码的方式去做转换,因为每个字符都对应一个 ascii 码,当对这个字符做加减乘除的时候,实际上就是对 ascii 码做加减乘除操作,也就是整型操作,最终会返回一个整型数字.

PHP不使用内置函数实现字符串转整型的方法示例
-图片转自网络-

通过上图可以看到字符 '0' ~ '9' 的 ascii 码是 48~57 我们在转换的时候就是用每一个字符减去 '0' 例如: '1' - '0' = 1、'2' - '0' = 2 返回值就是一个Int类型,下面具体看代码实现.

function convertInt($strInt = ''){ 
 $len = strlen($strInt); 
 $int = 0;

 for($i=0;$i<$len;$i++){
  $int *= 10;   
  $num = $strInt{$i} - '0';   
  $int += $num;  
 }

 return $int;  
}

 $num = '345432123'; 
 var_dump(convertInt($num)); //输出: int(345432123)

在 Redis 里面也有提供一个字符串转整型的函数,也是通过ascii码方式去做的,实现的比较完善严谨,具体可以参考下

string2ll 函数

#include <stdio.h>
#include <limits.h>
#include <string.h>

/* Convert a string into a long long. Returns 1 if the string could be parsed
 * into a (non-overflowing) long long, 0 otherwise. The value will be set to
 * the parsed value when appropriate. */
int string2ll(const char *s, size_t slen, long long *value) {
 const char *p = s;
 size_t plen = 0;
 int negative = 0;
 unsigned long long v;

 if (plen == slen)
  return 0;

 /* Special case: first and only digit is 0. */
 if (slen == 1 && p[0] == '0') {
  if (value != NULL) *value = 0;
  return 1;
 }

 if (p[0] == '-') {
  negative = 1;
  p++; plen++;

  /* Abort on only a negative sign. */
  if (plen == slen)
   return 0;
 }

 /* First digit should be 1-9, otherwise the string should just be 0. */
 if (p[0] >= '1' && p[0] <= '9') {
  v = p[0]-'0';
  p++; plen++;
 } else if (p[0] == '0' && slen == 1) {
  *value = 0;
  return 1;
 } else {
  return 0;
 }

 while (plen < slen && p[0] >= '0' && p[0] <= '9') {
  if (v > (ULLONG_MAX / 10)) /* Overflow. */
   return 0;
  v *= 10;

  if (v > (ULLONG_MAX - (p[0]-'0'))) /* Overflow. */
   return 0;
  v += p[0]-'0';

  p++; plen++;
 }

 /* Return if not all bytes were used. */
 if (plen < slen)
  return 0;

 if (negative) {
  if (v > ((unsigned long long)(-(LLONG_MIN+1))+1)) /* Overflow. */
   return 0;
  if (value != NULL) *value = -v;
 } else {
  if (v > LLONG_MAX) /* Overflow. */
   return 0;
  if (value != NULL) *value = v;
 }
 return 1;
}

//-------- 执行 ---------
int main(){
 long long num;
 string2ll("345432123",strlen("345432123"),&num);
 printf("%d\n",num); //输出 345432123
 retunr 0;
}

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

PHP 相关文章推荐
一棵php的类树(支持无限分类)
Oct 09 PHP
PHP+APACHE实现用户论证的方法
Oct 09 PHP
PHP函数之error_reporting(E_ALL ^ E_NOTICE)详细说明
Jul 01 PHP
解析PHP生成静态html文件的三种方法
Jun 18 PHP
使用PHP备份MYSQL数据的多种方法
Jan 15 PHP
简单解决新浪SAE无法上传文件的问题
May 13 PHP
PHP基于单例模式实现的mysql类
Jan 09 PHP
PHP实现的构造sql语句类实例
Feb 03 PHP
CI框架的安全性分析
May 18 PHP
PHP实现的同步推荐操作API接口案例分析
Nov 30 PHP
php获取linux命令结果的实例
Mar 13 PHP
php获取小程序码的实现代码(B类接口)
Jun 13 PHP
利用PHP判断是否是连乘数字串的方法示例
Jul 03 #PHP
使用Zttp简化Guzzle 调用
Jul 02 #PHP
详解php几行代码实现CSV格式文件输出
Jul 01 #PHP
Laravel 中使用 Vue.js 实现基于 Ajax 的表单提交错误验证操作
Jun 30 #PHP
详解如何在云服务器上部署Laravel
Jun 30 #PHP
[企业公众号]升级到[企业微信]之后发送消息失败的解决方法
Jun 30 #PHP
ThinkPHP实现登录退出功能
Jun 29 #PHP
You might like
解析WordPress中函数钩子hook的作用及基本用法
2015/12/22 PHP
PHP递归算法的简单实例
2019/02/28 PHP
Firefox和IE浏览器兼容JS脚本写法小结
2008/07/07 Javascript
extjs 初始化checkboxgroup值的代码
2011/09/21 Javascript
ExtJs中gridpanel分组后组名排序实例代码
2013/12/02 Javascript
JS小游戏之宇宙战机源码详解
2014/09/25 Javascript
完美兼容各大浏览器的jQuery插件实现图片切换特效
2014/12/12 Javascript
JavaScript创建一个object对象并操作对象属性的用法
2015/03/23 Javascript
轻松学习jQuery插件EasyUI EasyUI表单验证
2015/12/01 Javascript
解决jQuery上传插件Uploadify出现Http Error 302错误的方法
2015/12/18 Javascript
快速入门Vue
2016/12/19 Javascript
Vue.js 点击按钮显示/隐藏内容的实例代码
2018/02/08 Javascript
vue实现tab切换外加样式切换方法
2018/03/16 Javascript
React如何避免重渲染
2018/04/10 Javascript
JS如何获取地址栏的参数实例讲解
2018/10/06 Javascript
vue-router之实现导航切换过渡动画效果
2019/10/31 Javascript
layui table表格数据的新增,修改,删除,查询,双击获取行数据方式
2019/11/14 Javascript
Nodejs实现WebSocket代码实例
2020/05/19 NodeJs
Vue实现小购物车功能
2020/12/21 Vue.js
Python常见文件操作的函数示例代码
2011/11/15 Python
python将图片文件转换成base64编码的方法
2015/03/14 Python
用Python实现一个简单的多线程TCP服务器的教程
2015/05/05 Python
Python验证码识别的方法
2015/07/10 Python
python字符串对其居中显示的方法
2015/07/11 Python
Python将多个excel文件合并为一个文件
2018/01/03 Python
Python 12306抢火车票脚本 Python京东抢手机脚本
2018/02/06 Python
在Python中输入一个以空格为间隔的数组方法
2018/11/13 Python
python pandas移动窗口函数rolling的用法
2020/02/29 Python
python的setattr函数实例用法
2020/12/16 Python
高校十八大报告感想
2014/01/27 职场文书
学生会主席事迹材料
2014/01/28 职场文书
互联网创业计划书写作技巧攻略
2014/03/23 职场文书
公司贷款承诺书
2014/05/30 职场文书
洗手间标语
2014/06/23 职场文书
会计学专业自荐信
2014/06/25 职场文书
vue3使用vue-router的完整步骤记录
2021/06/20 Vue.js