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 25 PHP
坏狼的PHP学习教程之第1天
Jun 15 PHP
mysql总结之explain
Feb 27 PHP
php获取服务器信息的实现代码
Feb 04 PHP
web站点获取用户IP的安全方法 HTTP_X_FORWARDED_FOR检验
Jun 01 PHP
解析如何在PHP下载文件名中解决乱码的问题
Jun 20 PHP
smarty获得当前url的方法分享
Feb 14 PHP
php跨服务器访问方法小结
May 12 PHP
php实现图片上传时添加文字和图片水印技巧
Apr 18 PHP
基于yaf框架和uploadify插件,做的一个导入excel文件,查看并保存数据的功能
Jan 24 PHP
php 7新特性之类型申明详解
Jun 06 PHP
基于PHP的登录和注册的功能的实现
Aug 06 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中mysql连接方式PDO使用详解
2015/02/25 PHP
PHP获取文件夹内文件数的方法
2015/03/12 PHP
php+ajax实现无刷新分页
2015/11/18 PHP
实例讲解php数据访问
2016/05/09 PHP
浅析PHP中json_encode与json_decode的区别
2020/07/15 PHP
用js怎么把&amp;字符换成&quot;&amp;amp:&quot;
2006/10/19 Javascript
javascript插入样式实现代码
2012/02/22 Javascript
深入理解javascript变量声明
2014/11/20 Javascript
avalon js实现仿google plus图片多张拖动排序附源码下载
2015/09/24 Javascript
JavaScript如何禁止Backspace键
2015/12/02 Javascript
jQuery Easyui加载表格出错时在表格中间显示自定义的提示内容
2016/12/08 Javascript
详谈js对url进行编码和解码(三种方式的区别)
2017/08/16 Javascript
JS监听组合按键思路及实现过程
2020/04/17 Javascript
JS绘图Flot如何实现动态可刷新曲线图
2020/10/16 Javascript
python中getaddrinfo()基本用法实例分析
2015/06/28 Python
Python将阿拉伯数字转换为罗马数字的方法
2015/07/10 Python
django session完成状态保持的方法
2018/11/27 Python
Python自动发送邮件的方法实例总结
2018/12/08 Python
Django网络框架之创建虚拟开发环境操作示例
2019/06/06 Python
PyQt5使用QTimer实现电子时钟
2019/07/29 Python
Python性能分析工具Profile使用实例
2019/11/19 Python
Pyspark获取并处理RDD数据代码实例
2020/03/27 Python
在PyTorch中使用标签平滑正则化的问题
2020/04/03 Python
pycharm激活方法到2099年(激活流程)
2020/09/22 Python
python爬虫工具例举说明
2020/11/30 Python
奢华时尚的独特视角:La Garçonne
2018/06/07 全球购物
Trip.com澳大利亚:在线旅行社
2019/12/01 全球购物
DataReader和DataSet的异同
2014/12/31 面试题
教师对学生的寄语
2014/04/03 职场文书
学生安全责任书模板
2014/07/25 职场文书
新教师个人工作总结
2015/02/06 职场文书
手术室护士个人总结
2015/02/13 职场文书
合作意向书怎么写
2019/06/24 职场文书
Java 泛型详解(超详细的java泛型方法解析)
2021/07/02 Java/Android
分享mysql的current_timestamp小坑及解决
2021/11/27 MySQL
Java对文件的读写操作方法
2022/04/29 Java/Android