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的输入输出流
Feb 14 PHP
深入file_get_contents与curl函数的详解
Jun 25 PHP
如何使用PHP实现javascript的escape和unescape函数
Jun 29 PHP
zend framework文件上传功能实例代码
Dec 25 PHP
php返回字符串中所有单词的方法
Mar 09 PHP
php中使用key,value,current,next和prev函数遍历数组的方法
Mar 17 PHP
php array_pop 删除数组最后一个元素实例
Nov 02 PHP
thinkPHP框架可添加js事件的分页类customPage.class.php完整实例
Mar 16 PHP
php正则表达式基本知识与应用详解【经典教程】
Apr 17 PHP
PHP文字转图片功能原理与实现方法分析
Aug 31 PHP
php apache开启跨域模式过程详解
Jul 08 PHP
php微信小程序解包过程实例详解
Mar 31 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
php&amp;java(三)
2006/10/09 PHP
利用PHP和AJAX创建RSS聚合器的代码
2007/03/13 PHP
PHP实现的基于单向链表解决约瑟夫环问题示例
2017/09/30 PHP
php利用ob_start()清除输出和选择性输出的方法
2018/01/18 PHP
PHP检查文件是否存在,不存在自动创建及读取文件内容操作示例
2020/01/23 PHP
JavaScript入门教程(1) 什么是JS
2009/01/31 Javascript
基于jquery的滚动鼠标放大缩小图片效果
2011/10/27 Javascript
jquery 插件学习(五)
2012/08/06 Javascript
JQuery加载图片自适应固定大小的DIV
2013/09/12 Javascript
多选列表框动态添加,移动,删除,全选等操作的简单实例
2014/01/13 Javascript
详细解读AngularJS中的表单验证编程
2015/06/19 Javascript
JS实现队列与堆栈的方法
2016/04/21 Javascript
AngularJS入门教程之静态模板详解
2016/08/18 Javascript
js获取文件里面的所有文件名(实例)
2017/10/17 Javascript
vue实现移动端轻量日期组件不依赖第三方库的方法
2019/04/28 Javascript
javascript实现贪吃蛇经典游戏
2020/04/10 Javascript
Vue项目利用axios请求接口下载excel
2020/11/17 Vue.js
python Django批量导入数据
2016/03/25 Python
深入了解Python中pop和remove的使用方法
2018/01/09 Python
python 中的list和array的不同之处及转换问题
2018/03/13 Python
VScode编写第一个Python程序HelloWorld步骤
2018/04/06 Python
python爬虫获取百度首页内容教学
2018/12/23 Python
Python使用requests提交HTTP表单的方法
2018/12/26 Python
linux安装python修改默认python版本方法
2019/03/31 Python
python SQLAlchemy的Mapping与Declarative详解
2019/07/04 Python
django 捕获异常和日志系统过程详解
2019/07/18 Python
使用Python的datetime库处理时间(RPA流程)
2019/11/24 Python
Selenium 安装和简单使用的实现
2020/12/04 Python
基于HTML5陀螺仪实现ofo首页眼睛移动效果的示例
2017/07/31 HTML / CSS
初中音乐教学反思
2014/01/12 职场文书
《七颗钻石》教学反思
2014/02/28 职场文书
2014年教师党员自我评议
2014/09/19 职场文书
学生会工作感言
2015/08/07 职场文书
关于运动会的广播稿
2015/08/19 职场文书
redis cluster支持pipeline的实现思路
2021/06/23 Redis
浅谈音视频 pts dts基本概念及理解
2022/08/05 数码科技