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正则校验用户名介绍
Jul 19 PHP
php强制下载类型的实现代码
Apr 21 PHP
ajax取消挂起请求的处理方法
Mar 18 PHP
php实现文件下载简单示例(代码实现文件下载)
Mar 10 PHP
PHP中if和or运行效率对比
Dec 12 PHP
Yii框架在页面输出执行sql语句以方便调试的实现方法
Dec 24 PHP
php简单统计中文个数的方法
Sep 30 PHP
php获取网站根目录物理路径的几种方法(推荐)
Mar 04 PHP
PHP数据库编程之MySQL优化策略概述
Aug 16 PHP
CI框架实现创建自定义类库的方法
Dec 25 PHP
php设计模式之抽象工厂模式分析【星际争霸游戏案例】
Jan 23 PHP
PHP基于ip2long实现IP转换整形
Dec 11 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
声音就能俘获人心,蕾姆,是哪个漂亮小姐姐配音呢?
2020/03/03 日漫
德劲1103的维修打理经验
2021/03/02 无线电
护卫神php套件 php版本升级方法(php5.5.24)
2015/05/10 PHP
php中strtotime函数性能分析
2016/11/20 PHP
分享几种好用的PHP自定义加密函数(可逆/不可逆)
2020/09/15 PHP
jValidate 基于jQuery的表单验证插件
2009/12/12 Javascript
禁止js文件缓存的代码
2010/04/09 Javascript
asp.net刷新本页面的六种方法总结
2014/01/07 Javascript
Javascript排序算法之合并排序(归并排序)的2个例子
2014/04/04 Javascript
JavaScript实现检查页面上的广告是否被AdBlock屏蔽了的方法
2014/11/03 Javascript
修复bash漏洞的shell脚本分享
2014/12/31 Javascript
JS获取下拉框显示值和判断单选按钮的方法
2015/07/09 Javascript
jQuery实现两款有动画功能的导航菜单代码
2015/09/16 Javascript
浅谈angular.js中实现双向绑定的方法$watch $digest $apply
2015/10/14 Javascript
javascript基础知识分享之类与函数化
2016/02/13 Javascript
jquery实用技巧之输入框提示语句
2016/07/28 Javascript
jquery点击展示与隐藏更多内容
2016/12/03 Javascript
jquery中绑定事件的异同
2017/02/28 Javascript
webpack开发环境和生产环境的深入理解
2018/11/08 Javascript
vue cli 3.x 项目部署到 github pages的方法
2019/04/17 Javascript
vue封装可复用组件confirm,并绑定在vue原型上的示例
2019/10/31 Javascript
小程序实现录音上传功能
2019/11/22 Javascript
使用Bootstrap做一个朝代历史表
2019/12/10 Javascript
[01:20]PWL S2开团时刻第三期——团战可以输 蝙蝠必须死
2020/11/26 DOTA
python实现冒泡排序算法的两种方法
2018/03/10 Python
Python中import导入不同目录的模块方法详解
2020/02/18 Python
Anconda环境下Vscode安装Python的方法详解
2020/03/29 Python
解决python ThreadPoolExecutor 线程池中的异常捕获问题
2020/04/08 Python
HTML5之WebGL 3D概述(上)—WebGL原生开发开启网页3D渲染新时代
2013/01/31 HTML / CSS
html5 跨文档消息传输示例探讨
2013/04/01 HTML / CSS
性能测试工程师的面试题
2015/02/20 面试题
医学护理毕业生自荐信
2013/11/07 职场文书
婚纱摄影师求职信范文
2014/04/17 职场文书
社团活动总结范文
2014/04/26 职场文书
停车场管理协议书范本
2014/10/08 职场文书
五年级作文之想象作文
2019/10/30 职场文书