php 中的sprintf 坑
先说下为什么要写这个函数的前言,这个是我在看工作中发现一处四舍五入的bug后,当时非常不理解,
echo sprintf('%.2f',123.455); //123.45
echo sprintf('%.2f',12.455);//12.46
于是查了百度,但是很多结果都很笼统,结果也很少,后来查阅了相关资料总结了下:
基本语法格式:sprintf("%格式化类型","$str1","$str2") ;先别急我会一个个慢慢说
先看一下类型参照表,也就是要转换成什么类型的格式
%d 十进制有符号整数
%u 十进制无符号整数
%f 浮点数
%s 字符串
%c 单个字符
%p 指针的值
%e 指数形式的浮点数
%x, %X 无符号以十六进制表示的整数
%o 无符号以八进制表示的整数
%g 自动选择合适的表示法
说明: (). 可以在"%"和字母之间插进数字表示最大场宽。 例如: %3d 表示输出3位整型数, 不够3位右对齐。 %9.2f 表示输出场宽为9的浮点数, 其中小数位为2, 整数位为6, 小数点占一位, 不够9位右对齐。 %8s 表示输出8个字符的字符串, 不够8个字符右对齐。 如果字符串的长度、或整型数位数超过说明的场宽, 将按其实际长度输出。 但对浮点数, 若整数部分位数超过了说明的整数位宽度, 将按实际整数位输出; 若小数部分位数超过了说明的小数位宽度, 则按说明的宽度以四舍五入输出。 另外, 若想在输出值前加一些0, 就应在场宽项前加个0。 (即不够场宽的用0补足) 例如: %04d 表示在输出一个小于4位的数值时, 将在前面补0使其总宽度为4位。 如果用浮点数表示字符或整型量的输出格式, 小数点后的数字代表最大宽度, 小数点前的数字代表最小宽度。 例如: %.9s 表示显示一个长度不小于6且不大于9的字符串。若大于9, 则第9个字符以后的内容将被删除。 (). 可以在"%"和字母之间加小写字母l, 表示输出的是长型数。 例如: %ld 表示输出long整数 %lf 表示输出double浮点数 (). 可以控制输出左对齐或右对齐, 即在"%"和字母之间加入一个"-" 号可说明输出为左对齐, 否则为右对齐。 例如: %-7d 表示输出7位整数左对齐 %-10s 表示输出10个字符左对齐 . 一些特殊规定字符 b 字符 作用 \n 换行
\f 清屏并换页
\r 回车
\t Tab符
\xhh 表示一个ASCII码用16进表示,
其中hh是1到2个16进制数
举例几个简单的应用
<?php
printf("$%01.2f", 43.2); // 运行结果:$43.20 printf("%d bottles of beer on %s", 100, "the wall"); //运行结果:100 bottles of beer on the wall
printf("%15s", "some text"); //运行结果:some text
?>
<?php
printf("The %2\$s likes to %1\$s",111, "dog", "bark");
//运行结果: The dog likes to 111
printf("The %1\$s says: %2\$s, %2\$s.", "dog", "bark");
//运行结果:The dog says: bark, bark.
?>
<?php $var1 = 68.75;
$var2 = 54.35;
$var3 = $var1 + $var2;
echo $var3.'<br>'; // 变量 $var3 值为 "123.1";
$formatted = sprintf ("%01.2f", $var3); echo $formatted;
// 变量$var3 值为 "123.10"
?>
<?php
$money = 1.4;
$formatted = sprintf ("%-01.2f", $money);
echo $formatted;//1.40
?>
再举个最简单的案例
<?php
$str1="1234"; echo sprintf("hello%s","$str1"); //输出为: hello1234 ?>
要点:
%s = %符号和后面属性符号(s)总称为插入标记组合,也就是把后面准备进行格式化的值($str1)替换在这个位置
hello = 这个单词就是很多人蒙蔽的地方,告诉你这个什么代表也没有,就单纯的代表一个hello,用于分割或者修饰用,一般用[ %s ]、<%s>这样格式化出来后就直接在标签里
记住,一个%标记符后面只有一个类型属性(比如s),s是什么上面有,以字符串的方式格式化
那么多个值怎么格式化一起呢
<?php
$a="abcdef";
$b="abcdef"; $c="1234";
echo sprintf("%1\$s%2\$s",$c,$a); //输出为: 1234abcdef ?>
%s为一个标记,两个%s%s这样写却是错误的,每个%s必须标记键位,不然我怎么知道都代表格式化后面的哪个$str呢,所以有个特别的语法 %1\$%2\$ 解释:%1表示格式化sprintf("%1\$%2\$",''$str1","$str2")中对应的$str1,那么%2自然表示格式化$str2,\$是代表有多个值准备格式化,所以每个%1和%2或者还有%3的标记后都要加这个符号代表一行中有多个标记,如果只有一个标记就不用\$了占位符了,记住$str2、$str3是可选,也就是可以不格式化这么多
再来个特殊的例子
<?php
$a="abcdef";
$b="abcdef"; $c="1234";
echo sprintf("%'a13.2f",$c); // 输出为:aaaaaa1234.00 //echo sprintf("%06.2f", $a); ?>
sprintf("%'a13.2f",$c);
这是什么意思,f是浮点数,第一步按照格式 % '(补位值) 宽度值 格式化类型 这三部分,语法之间必须紧挨着不能用空格
必须解释一下何为补位值:就是设定的宽度超出了,用这个值来填上
解释一下,补位值只有设置宽度超出了目标值才能用
所以就是用a补位,13为总宽度,2为小数点后的宽度,f为格式化类型,别急我会解释
' 号(单引号)代表接下来要用补位类型
为什么他能识别x是补位值呢,因为前面有 ' 号,
为什么他能识别哪几位是哪种类型呢,他是这样识别的,按顺序从先从两头的字符开始识别是什么类型,补位值肯定是单数位,不可能一个位置补两个数吧,所以左边第一位x是补位值,右边第一位是格式化类型,然后中间的自然是宽度值
第二,为什么小数点 后还有一个属性 ,因为这是f(浮点型),必须设置小数点后有几位,不能小数后面不能设置了吧,那浮点数意义何在呢
来个整数补位
<?php
$a="abcdef";
$b="abcdef"; $c="1234";
echo sprintf("%'07s",$c); //结果是:0001234 ?>
这就是整数补位,还是一样
第一步按照格式 % '(补位值) 宽度值 格式化类型 这三部分
0是补位值 7是宽度值 s自然是格式化类型
还有一种最重要的例子
<?php
$a="abcdef";
$b="abcdef"; $c="1234";
echo sprintf("[%-6s]",$c); //结果是:[1234 ] echo sprintf("[%-4s]",$c); //结果是:[1234] echo sprintf("[%4.2s]",$c); //结果是:[ 12] ?>
这个第一步 [ ] 仅仅只是修饰,不用理解
第二步,没有 ' 号,证明没有补位,无需添加补位值
所以语法格式为 : % 宽度值 格式化类型 这两部分
第一二行解释如下:
第一个宽度为6,但是$c=1234 ,只有4个字符,所以宽度不够,所以右边自动扩充(扩充再多也只显示一个空格位置),为什么在右边扩充,因为宽度前有个 - 号,代表补位方向相反,如在补位值前加-,自然从右边开始补位
下面为什么没变化,因为宽度正好一致,只是补位的方向改变了
第三行解释如下:
不要被蒙蔽了,语法结构还是一样 % 宽度值 格式化类型 这两部分
没有 ' 号,证明没有补位,无需添加补位值
所以4.2依旧是宽度值
只是小数点左边的4代表总宽度,右边的2代表只显示2位出来,所以又空缺了两个,所以左边开始扩充两个空位,为什么只显示一个空格上一段说了,再说一次吧扩充再多也只显示一个空格位置。默认从左边开始
php 中的sprintf 坑的更多相关文章
- 整理iOS9适配中出现的坑(图文)
原文: http://www.cnblogs.com/dsxniubility/p/4821184.html 整理iOS9适配中出现的坑(图文) 本文主要是说一些iOS9适配中出现的坑,如果只是要 ...
- Nancy总结(二)记一次Nancy 框架中遇到的坑
记一次Nancy 框架中遇到的坑 前几天,公司一个项目运行很久的Nancy框架的网站,遇到了一个很诡异的问题.Session 对象跳转到另外一个页面的时候,session对象被清空了,导致用户登录不上 ...
- 整理 iOS 9 适配中出现的坑(图文)(转)
作者:董铂然 本文主要是说一些iOS9适配中出现的坑,如果只是要单纯的了解iOS9新特性可以看瞄神的开发者所需要知道的 iOS 9 SDK 新特性.9月17日凌晨,苹果给用户推送了iOS9正式版,随着 ...
- 整理 iOS 9 适配中出现的坑
本文主要是说一些iOS9适配中出现的坑,如果只是要单纯的了解iOS9新特性可以看瞄神的开发者所需要知道的 iOS 9 SDK 新特性.9月17日凌晨,苹果给用户推送了iOS9正式版,随着有用户陆续升级 ...
- 整理 iOS 9 适配中出现的坑(图文)
作者:董铂然 授权本站转载. 本文主要是说一些iOS9适配中出现的坑,如果只是要单纯的了解iOS9新特性可以看瞄神的开发者所需要知道的 iOS 9 SDK 新特性.9月17日凌晨,苹果给用户推送了iO ...
- C++中对sprintf()函数的说明(转)
在将各种类型的数据构造成字符串时,sprintf 的强大功能很少会让你失望.由于sprintf 跟printf 在用法上几乎一样,只是打印的目的地不同而已,前者打印到字符串中,后者则直接在命令行上输出 ...
- iOS内购(IAP)中的那些坑
公司的公共库原来并没有这部分的代码,以前做内购是用两个比较有名的github上的第三方库.一个叫MKStoreKit,另一个叫IAPManager,我看了一下写的都很辣鸡,使用起来很不方便,而且写的还 ...
- jquery 的 each 方法中 return 的坑
jquery 的 each 方法中 return 的坑 Chapter 0 在项目中使用 jquery 的 each 方法时想在 each 的循环中返回一个布尔类型的值于是掉进一个坑中... Chap ...
- rabbitmq在ios中实战采坑
1. rabbitmq在ios中实战采坑 1.1. 问题 ios使用rabbitmq连接,没过多久就断开,并报错.且用android做相同的步骤并不会报错,错误如下 Received connecti ...
随机推荐
- springboot读取properties和yml配置文件
一.新建maven工程:springboot-configfile-demo,完整工程如下: pom.xml <?xml version="1.0" encoding=&qu ...
- kali安装配置ftp
参考:https://zhidao.baidu.com/question/1511146077646448900.html 一)安装 1.用sudo apt-get install 下载安装包
- Springboot高版本中@ConfigurationProperties注解取消location属性
在spring boot 1.5 版本之前 在@ConfigurationProperties注释中有两个属性:locations:指定配置文件的所在位置prefix:指定配置文件中键名称的前缀 sp ...
- AssetBundle使用心得【资源加载】
0.资源加载方式 静态资源 Asset下所有资源称为静态资源 Resources资源 Resources目录下,通过实例化得到的资源 AssetBundle资源 又称为增量更新资源 1.什么是Asse ...
- Coding能力提升小技巧
一.使用变量的一般原则 1.变量初始化原则: 通常在变量声明时初始化; 在靠近变量第一次使用的位置初始化; 在类的构造函数里初始化变量. 2.作用域: 使变量引用局部化,即把引用到变量的地方尽可能集中 ...
- WHU1124 Football Match
http://acm.whu.edu.cn/learn/problem/detail?problem_id=1124 题目大意:有N支球队,你们是第N支.每个队伍已经有一些分数了,接下来还有M场比赛. ...
- so静态分析进阶练习——一个CreakeMe的分析思路
i春秋作家:HAI_ 原文来自:https://bbs.ichunqiu.com/thread-41371-1-1.html 说明 拿到一个CreakeMe,写一个分析思路.CreakMe主要是对.s ...
- IPv6技术详解:基本概念、应用现状、技术实践(上篇)
本文来自微信技术架构部的原创技术分享. 1.前言 普及IPV6喊了多少年了,连苹果的APP上架App Store也早已强制IPV6的支持,然并卵,因为历史遗留问题,即使在IPV4地址如果饥荒的情况下, ...
- 有没有人曾告诉你,你的SQL又报错了?[开发篇]
引语:线上运行的真实环境总是变幻莫测,明明你在本地测试的时候各种情况都是OK得不要不要的,也许你还在为自己某个地方炫酷的效果以及神奇的设计感到激动不已!但是,到线上以后,他就会偶尔跟抽风一样的跟你sa ...
- CSS 常用技巧
概述 相信大家在写css属性的时候,会遇到一些问题,比如说:垂直对齐,垂直居中,背景渐变动画,表格宽度自适应,模糊文本,样式重置,清除浮动,通用媒体查询,自定义选择文本,强制出现滚动条,固定头部和页脚 ...