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 相关文章推荐
1.PHP简介
Oct 09 PHP
PHP在线生成二维码(google api)的实现代码详解
Jun 04 PHP
thinkphp验证码显示不出来的解决方法
Mar 29 PHP
PHP使用Session遇到的一个Permission denied Notice解决办法
Jul 30 PHP
PHP正则表达式替换站点关键字链接后空白的解决方法
Sep 16 PHP
Symfony2联合查询实现方法
Mar 18 PHP
php实现的debug log日志操作类实例
Jul 12 PHP
php图像验证码生成代码
Jun 08 PHP
PHP封装的验证码工具类定义与用法示例
Aug 22 PHP
PHP面向对象程序设计之多态性的应用示例
Dec 19 PHP
如何在PHP环境中使用ProtoBuf数据格式
Jun 19 PHP
PHP超全局变量实现原理及代码解析
Sep 01 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 代码优化之经典示例
2011/03/24 PHP
php站内搜索并高亮显示关键字的实现代码
2011/12/29 PHP
php木马webshell扫描器代码
2012/01/25 PHP
解析ajax事件的调用顺序
2013/06/17 PHP
php 发送带附件邮件示例
2014/01/23 PHP
PHP FTP操作类代码( 上传、拷贝、移动、删除文件/创建目录)
2014/05/10 PHP
php使用Jpgraph绘制复杂X-Y坐标图的方法
2015/06/10 PHP
Yii2实现UploadedFile上传文件示例
2017/02/15 PHP
Js setInterval与setTimeout(定时执行与循环执行)的代码(可以传入参数)
2010/06/11 Javascript
javascript 节点排序 2
2011/01/31 Javascript
jquery.ui.draggable中文文档(原文翻译)
2013/11/15 Javascript
.NET微信公众号开发之创建自定义菜单
2015/07/16 Javascript
浅析JavaScript中的变量复制、参数传递和作用域链
2016/01/13 Javascript
检查表单元素的值是否为空的实例代码
2016/06/16 Javascript
url中的特殊符号有什么含义(推荐)
2016/06/17 Javascript
Ajax跨域实现代码(后台jsp)
2017/01/21 Javascript
AngularJS前端页面操作之用户修改密码功能示例
2017/03/27 Javascript
Vue应用部署到服务器的正确方式
2017/07/15 Javascript
js实现鼠标移动到图片产生遮罩效果
2017/10/21 Javascript
JS写XSS cookie stealer来窃取密码的步骤详解
2017/11/20 Javascript
jquery手机触屏滑动拼音字母城市选择器的实例代码
2017/12/11 jQuery
深入浅析Vue.js 中的 v-for 列表渲染指令
2018/11/19 Javascript
微信小程序实现带参数的分享功能(两种方法)
2019/05/17 Javascript
微信小程序实现音乐播放器
2019/11/20 Javascript
Vue项目如何引入bootstrap、elementUI、echarts
2020/11/26 Vue.js
python list转dict示例分享
2014/01/28 Python
Python实现批量下载图片的方法
2015/07/08 Python
在Python的Django框架中使用通用视图的方法
2015/07/21 Python
Python使用迭代器打印螺旋矩阵的思路及代码示例
2016/07/02 Python
python微信撤回监测代码
2019/04/29 Python
pygame用blit()实现动画效果的示例代码
2020/05/28 Python
详解如何在pyqt中通过OpenCV实现对窗口的透视变换
2020/09/20 Python
拥有超过850家商店的美国在线派对商店:Party City
2018/10/21 全球购物
2019年分享net面试的经历和题目
2016/08/07 面试题
英语四级考试作弊检讨书
2014/09/29 职场文书
2019年励志签名:致拼搏路上的自己
2019/10/11 职场文书