php中的sprintf()函数的format格式字符串

来源:互联网 发布:域名转入万网和阿里云 编辑:程序博客网 时间:2024/05/17 00:02

上次碰到的ASCII码问题,查看别人博客时,发现使用sprintf(),可以来输出。这个输出函数,以前也看了好多次,然而并未仔细看它的用途。这次就彻底查看手册,整明白,到底可以做什么。就有了如下的文档翻译,因中文文档该函数文档也是英文,只能是自己有限的翻译下:


format字符串由0个或更多的指令组成:普通字符(除了%)不会转变,直接复制到结果字符串中;转换说明(conversion specifications),每个都会获取自己的参数,并替换到结果字符串中。
应用在sprintf()和printf()中。
每个转换说明由一个%,%后,按顺序跟着一个或多个下面的元素:

1.一个可选的标志说明符,用于数字,表示正负(- | +)。在php4.3.0添加上。

2.一个可选的标志说明符,设置用于填充到结果字符串右边的字符,以达到结果字符串的长度。可能是空格或0.默认以空格填充。可以指定一个可选的填充字符,以 "'"(单引号) 作为前缀。

3.一个可选的标志说明符,设置结果应该是左对齐还是右对齐。默认是右对齐,设置 '-' ,将变为左对齐。

4.一个可选的数字说明符,设置转换后的字符长度(最小长度)。

5.一个可选的精度说明符,格式是:小数点+可选的十进制数字(.3),表示应该显示几个小数位数。

1>当在一个字符串中使用了这个指定符,它扮演的就像一个”分界符“(a cutoff point),设置限制显示字符串的最大长度。(例如:sprintf('%.4s', 'dongxuemin'),将输出:dong)

2>Additionally, the character to use when padding a number may optionally be specified between the period and the digit. -- 实在是翻译的不对劲啊(另外,当填充一个数字时,在小数点和数字中间,可以选择性的指定一个填充字符。测试不正确。。不懂这句话的意思)

6.一个类型说明符,告诉参数数据应该被当作什么类型。可能的类型如下:

% - 字面的%,不需要任何参数。(结果想输出%,就得是%%)

b - 参数被当作整型,代表一个二进制数字

c - 参数被当作整型,代表一个ASCII码

d - 参数被当作整型,代表一个十进制数字

e - 参数被当作一个科学计数(例如:1.2e+2),精度说明符代表小数点后数字的个数(PHP5.2.1新增),更早的版本中,它被作为有效位数的个数。

E - 同%e一样,只是使用的大写字母(例如:1.2E+2)

f - 参数被当作浮点型,代表一个符点数(浮点格式输出)

F - 参数被当作浮点型,代表一个符点数(非符点格式输出)

g - %e和%f的简写

G - %E和%f的简写

o - 参数被当作整型,代表一个八进制数字

s - 参数被当作字符型,代表一个字符串

u - 参数被当作整型,代表一个无符号的十进制数字

x - 参数被当作整型,代表一个十六进制数字(小写字母)

X - 参数被当作整型,代表一个十六进制数字(大写字母)

说明符的变量,会被强迫归结为一个合适的类型:

TypeSpecifiersstringsintegerducoxXbdoublegGeEfF警告:
尝试结合使用字符串说明符和宽度说明符,每个字符将需要多于一个字节的存储空间,这可能不是我们希望的结果(自己按需使用)
格式字符串支持参数编号/参数交换
手册上的几个实例:

1.参数交换

$num = 5;$location = 'tree';$format = 'There are %d monkeys in the %s';echo sprintf($format, $num, $location); // %d-$num & %s-$location 替换,输出:'There are monkeys in the tree'

2.假设:我们在一个单独的文件中,来专门存储格式字符串。因为通常的程序会有国际化这一架构,会将程序中有关提醒、输出的字符串定义为 “格式化字符串”,写在单独的文件中或目录(一般是locale),再根据不同的语言来进行替换输出。

现在有一个问题。格式化字符串中占位符的顺序,和代码中参数的顺序不匹配。
$format = 'The %s contains %d monkeys';// 第一个是%s,第二个是%d
<span style="font-family: Arial, Helvetica, sans-serif;">echo sprintf($format, $num, $location);// 参数的一个是num,第二个是字符串。和上面的顺序不匹配</span>
// 我们肯定不会修改代码中参数的位置,而是简单的指出格式化字符串中,占位符应该使用哪个参数。所以,格式化字符串应该像下面一样修改:
$format = 'The %2$s contains %1$d monkeys';// 可以使用这种方式,指定使用%s使用第二个参数,%d使用第一个参数
echo sprintf($format, $num, $location); // 函数调用参数顺序不变(函数可能在很多地方调用)

3.上面的使用方式,有一个额外的好处:我们不用在函数调用中,添加额外的参数,就可以重复使用占位符,例如:

$format = 'The %2$s contains %1$d monkeys.That\'s a nice %2$s full of %1$d monkeys.';// 同样的占位符,使用了多次echo sprintf($format, $num, $location); // 函数调用并未添加额外的参数

4.当使用参数转换,“n$” 位置说明符必需紧随 “%” 后,在其他说明符前面

5.指定 “填充字符”,就像我们前面说的,以单引号(')作为前缀

echo sprintf("%'.9d\n", 123);// 输出:......123echo sprintf("%'.09d\n", 123);// 输出:000000123 ------- 以(')开头,以为填充的是.,但并不是,而是.后的字符0。测试了下:sprintf("%'. 9d\n", 123),也会以 ' '(空格)填充。其他字符则不会。// 此外,再测试了下,空格&0的填充:echo sprintf("%09d\n", 123);// 以0填充,不需要'(单引号)echo sprintf("% 9d\n", 123);// 以空格填充,不需要'(单引号)

分析:0和空格,比较特殊,记住这几种方式都可以填充。其他字符还是老老实实使用标准的 'x 进行填充.

6.位置说明符与其他说明符一起使用:

$format = 'The %2$s contains %1$04d monkeys';echo sprintf($format, $num, $location);// 输出:The tree contains 0005 monkeys

注意:
尝试使用 “位置说明符” > PHP_INT_MAX,将会产生一个warning的错误!显示:“Warning The c type specifier ignores padding and width”。不过,我们肯定不会这么写错的。。

0 0