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 不同编码下的字符串长度区分
Sep 26 PHP
PHP手机号码归属地查询代码(API接口/mysql)
Sep 04 PHP
PHP中array_merge和array相加的区别分析
Jun 17 PHP
浅析PHP Socket技术
Aug 02 PHP
使用PHP导出Word文档的原理和实例
Oct 21 PHP
Drupal简体中文语言包安装教程
Sep 27 PHP
完整删除ecshop中获取店铺信息的API
Dec 24 PHP
PHP安装memcached扩展笔记
May 28 PHP
yii实现model添加默认值的方法(2种方法)
Jan 06 PHP
PHP 等比例缩放图片详解及实例代码
Sep 18 PHP
PHP开发APP端微信支付功能
Feb 17 PHP
详解PHP变量传值赋值和引用赋值变量销毁
Mar 23 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中通过HTTP_USER_AGENT判断是否为手机移动终端的函数代码
2013/02/14 PHP
php中防止SQL注入的最佳解决方法
2013/04/25 PHP
php读取mysql中文数据出现乱码的解决方法
2013/08/16 PHP
thinkphp 手机号和用户名同时登录
2017/01/20 PHP
获取网站跟路径的javascript代码(站点及虚拟目录)
2009/10/20 Javascript
JavaScript自定义方法实现trim()、Ltrim()、Rtrim()的功能
2013/11/03 Javascript
谈谈js中的prototype及prototype属性解释和常用方法
2015/11/25 Javascript
Angularjs实现带查找筛选功能的select下拉框示例代码
2016/10/04 Javascript
jquery对所有input type=text的控件赋值实现方法
2016/12/02 Javascript
BootStrap CSS全局样式和表格样式源码解析
2017/01/20 Javascript
几行js代码实现自适应
2017/02/24 Javascript
微信小程序实现轮播图效果
2017/09/07 Javascript
webpack+vue2构建vue项目骨架的方法
2018/01/09 Javascript
使用async-validator编写Form组件的方法
2018/01/10 Javascript
浅谈微信JS-SDK 微信分享接口开发(介绍版)
2018/08/15 Javascript
vue进入页面时滚动条始终在底部代码实例
2019/03/26 Javascript
Node.JS在命令行中检查Chrome浏览器是否安装并打开指定网址
2019/05/21 Javascript
5分钟快速看懂ES6中的反射与代理
2019/12/19 Javascript
Javascript柯里化实现原理及作用解析
2020/10/22 Javascript
python中hashlib模块用法示例
2017/10/30 Python
对django中foreignkey的简单使用详解
2019/07/28 Python
python 有效的括号的实现代码示例
2019/11/11 Python
Python如何实现强制数据类型转换
2019/11/22 Python
利用Pytorch实现简单的线性回归算法
2020/01/15 Python
Python如何实现爬取B站视频
2020/05/20 Python
CSS3实现淘宝留白的方法
2020/06/05 HTML / CSS
澳大利亚在线床零售商:Bedworks
2020/09/01 全球购物
如何查看在weblogic中已经发布的EJB
2012/06/01 面试题
外贸公司实习自我鉴定
2013/09/24 职场文书
大学自荐信
2013/12/12 职场文书
解除合同协议书
2014/04/17 职场文书
超市开店计划书
2014/04/26 职场文书
三年级上册科学教学计划
2015/01/21 职场文书
全陪导游词
2015/02/04 职场文书
2016年中学法制宣传日活动总结
2016/04/01 职场文书
利用Pycharm连接服务器的全过程记录
2021/07/01 Python