zoukankan      html  css  js  c++  java
  • 实例-sprintf() 函数详解-输出格式转换函数

    Part1:实例

    1 $filterfile = basename(PHP_SELF, '.php');
    2 if (isset($_GET['uselastfilter']) && isset($_COOKIE['ECSCP']['lastfilterfile']) && $_COOKIE['ECSCP']['lastfilterfile'] == sprintf('%X', crc32($filterfile)))
    3 {
    4    return array(
    5            'filter' => unserialize(urldecode($_COOKIE['ECSCP']['lastfilter'])),
    6            'sql'    => base64_decode($_COOKIE['ECSCP']['lastfiltersql'])
    7           );
    8 }

    上面是get_filter()函数重要的一部分

     

    crc32 — 计算一个字符串的 crc32 多项式

    说明

      int crc32 ( string $str )

      生成 str 的 32 位循环冗余校验码多项式。这通常用于检查传输的数据是否完整。

    Warning
      由于 PHP 的整数是带符号的,所以在 32 位系统上许多 crc32 校验码将返回负整数。 尽管在 64 位上所有 crc32() 的结果将都是正整数。

      因此你需要使用 sprintf() 或 printf() 的"%u"格式符来获取表示无符号 crc32 校验码的字符串。

    参数

      str
      要校验的数据。

    返回值

      返回 str crc32 校验的整数。

     解编码函数详解:php分页

     

    Part2:sprintf详解

    sprintf — Return a formatted string

    说明

      string sprintf ( string $format [, mixed $args [, mixed $... ]] )

      Returns a string produced according to the formatting string format.

    用处:把字符串进行多种类型的格式化

    用于:处理xml数据格式时,需要用到他来格式化等等

    基本语法格式:sprintf("%格式化类型","$str1","$str2") ;先别急我会一个个慢慢说

    先看一下类型参照表,也就是要转换成什么类型的格式

    这是转换格式的类型参照表

    先举个最简单的案例

    <?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("%'x13.2f",$c);// 效果为:xxxxxx1234.00
    //echo sprintf("%06.2f", $a);
    ?>

    sprintf("%'x13.2f",$c);

    这是什么意思,f是浮点数,第一步按照格式 %   '(补位值) 宽度值  格式化类型  这三部分,语法之间必须紧挨着不能用空格

    必须解释一下何为补位值:就是设定的宽度超出了,用这个值来填上

    解释一下,补位值只有设置宽度超出了目标值才能用

    所以就是用x补位,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位出来,所以又空缺了两个,所以左边开始扩充两个空位,为什么只显示一个空格上一段说了,再说一次吧扩充再多也只显示一个空格位置。默认从左边开始

    Part3:输出格式转换函数

      printf 、 vprintf 、 sprintf 、vsprintf 、fprintf 、vfprintf 的各自的区别

      1)printf输出格式化字符串

        int printf ( string $format [, mixed $args [, mixed $... ]] )  

        依据 format 格式参数产生输出。

       参数

        format

       format 描述信息,请参见 sprintf()

          args 
          ...

      返回值

          返回输出字符串的长度。

      2)vprintf输出格式化字符串

        int vprintf ( string $format , array $args )

        根据 formatsprintf() 函数文档中有相关描述)参数指定的格式,在一个格式化字符串中显示多个值。

        作用与 printf() 函数类似,但是接收一个数组参数,而不是一系列可变数量的参数。

         参数

           format

      关于 format 的描述,参见 sprintf()

         args

       返回值

        返回输出字符串的长度。

      3)sprintfReturn a formatted string  格式化函数中用到最多的

        string sprintf ( string $format [, mixed $args [, mixed $... ]] )

        见Part2

      

     1 //Example #7 printf(): various examples
     2 
     3 <?php
     4 $n =  43951789;
     5 $u = -43951789;
     6 $c = 65; // ASCII 65 is 'A'
     7 
     8 // notice the double %%, this prints a literal '%' character
     9 printf("%%b = '%b'
    ", $n); // binary representation
    10 printf("%%c = '%c'
    ", $c); // print the ascii character, same as chr() function
    11 printf("%%d = '%d'
    ", $n); // standard integer representation
    12 printf("%%e = '%e'
    ", $n); // scientific notation
    13 printf("%%u = '%u'
    ", $n); // unsigned integer representation of a positive integer
    14 printf("%%u = '%u'
    ", $u); // unsigned integer representation of a negative integer
    15 printf("%%f = '%f'
    ", $n); // floating point representation
    16 printf("%%o = '%o'
    ", $n); // octal representation
    17 printf("%%s = '%s'
    ", $n); // string representation
    18 printf("%%x = '%x'
    ", $n); // hexadecimal representation (lower-case)
    19 printf("%%X = '%X'
    ", $n); // hexadecimal representation (upper-case)
    20 
    21 printf("%%+d = '%+d'
    ", $n); // sign specifier on a positive integer
    22 printf("%%+d = '%+d'
    ", $u); // sign specifier on a negative integer
    23 ?>  
    24 
    25 
    26 /**以上例程会输出:
    27 
    28 
    29 %b = '10100111101010011010101101'
    30 %c = 'A'
    31 %d = '43951789'
    32 %e = '4.39518e+7'
    33 %u = '43951789'
    34 %u = '4251015507'
    35 %f = '43951789.000000'
    36 %o = '247523255'
    37 %s = '43951789'
    38 %x = '29ea6ad'
    39 %X = '29EA6AD'
    40 %+d = '+43951789'
    41 %+d = '-43951789'
    42 **/
    43 
    44 
    45 //Example #8 printf(): string specifiers
    46 
    47 <?php
    48 $s = 'monkey';
    49 $t = 'many monkeys';
    50 
    51 printf("[%s]
    ",      $s); // standard string output
    52 printf("[%10s]
    ",    $s); // right-justification with spaces
    53 printf("[%-10s]
    ",   $s); // left-justification with spaces
    54 printf("[%010s]
    ",   $s); // zero-padding works on strings too
    55 printf("[%'#10s]
    ",  $s); // use the custom padding character '#'
    56 printf("[%10.10s]
    ", $t); // left-justification but with a cutoff of 10 characters
    57 ?>  
    58 
    59 /*以上例程会输出:
    60 [monkey]
    61 [    monkey]
    62 [monkey    ]
    63 [0000monkey]
    64 [####monkey]
    65 [many monke]
    66 */
    67 
    68 //Example #9 sprintf(): zero-padded integers
    69 
    70 <?php
    71 $isodate = sprintf("%04d-%02d-%02d", $year, $month, $day);
    72 ?>  
    73 
    74 //Example #10 sprintf(): formatting currency
    75 
    76 <?php
    77 $money1 = 68.75;
    78 $money2 = 54.35;
    79 $money = $money1 + $money2;
    80 // echo $money will output "123.1";
    81 $formatted = sprintf("%01.2f", $money);
    82 // echo $formatted will output "123.10"
    83 ?>  
    84 
    85 
    86 //Example #11 sprintf(): scientific notation
    87 
    88 <?php
    89 $number = 362525200;
    90 
    91 echo sprintf("%.3e", $number); // outputs 3.625e+8
    92 ?> 
    View Code

      4)vsprintf返回格式化字符串

        string vsprintf ( string $format , array $args )

        作用与 sprintf() 函数类似,但是接收一个数组参数,而不是一系列可变数量的参数。

       参数

        format

     关于 format 的描述,参见 sprintf()

        args

       返回值

        根据 formatsprintf() 函数文档中有相关描述)参数指定的格式,在一个字符串中返回一系列值。 

    1 <?php
    2 print vsprintf("%04d-%02d-%02d", explode('-', '1988-8-1')); // 1988-08-01
    3 ?> 
    View Code

      5)fprintf将格式化后的字符串写入到流

        int fprintf ( resource $handle , string $format [, mixed $args [, mixed $... ]] )

        写入一个根据 format 格式化后的字符串到 由 handle 句柄打开的流中。

       参数

        handle

       文件系统指针,是典型地由 fopen() 创建的 resource(资源)。

        format

       参见 sprintf() 中对 format 的描述。

        args 
        ...

       返回值

          返回写入的字符串长度。 

     1 //formatting currency
     2 <?php
     3 if (!($fp = fopen('currency.txt', 'w'))) {
     4     return;
     5 }
     6 
     7 $money1 = 68.75;
     8 $money2 = 54.35;
     9 $money = $money1 + $money2;
    10 // echo $money will output "123.1";
    11 $len = fprintf($fp, '%01.2f', $money);
    12 // will write "123.10" to currency.txt
    13 
    14 echo "wrote $len bytes to currency.txt";
    15 // use the return value of fprintf to determine how many bytes we wrote
    16 ?> 
    View Code

      6)vfprintf将格式化字符串写入流

        int vfprintf ( resource $handle , string $format , array $args )

        向由 handle 指定的流资源句柄中写入根据 format 格式化后的字符串。

        作用与 fprintf() 函数类似,但是接收一个数组参数,而不是一系列可变数量的参数。

       参数

          handle 
          format

        关于 format 的描述,参见 sprintf()

          args

       返回值

          返回输出字符串的长度。

    1 <?php
    2 if (!($fp = fopen('date.txt', 'w')))
    3     return;
    4 
    5 vfprintf($fp, "%04d-%02d-%02d", array($year, $month, $day));
    6 // 将向 date.txt 写入格式化的 ISO 标准日期
    7 ?> 
    View Code

    Part4:面试题

      网上找的的一个面试题

    说出echo、print、print_r、printf、sprintf之间的区别

    1:echo:是语句不是函数,没有返回值,可输出多个变量值,不需要圆括号。不能输出数组和对象,只能打印简单类型(如int,string)。

    2:print:是语句不是函数,有返回值 1 ,只能输出一个变量,不需要圆括号。不能输出数组和对象,只能打印简单类型(如int,string)。

    3:print_r:是函数,可以打印复合类型,例如:stirng、int、float、array、object等,输出array时会用结构表示,而且可以通过print_r($str,true)来使print_r不输出而返回print_r处理后的值

    4:printf:是函数,把文字格式化以后输出

    5:sprintf:是函数,跟printf相似,但不打印,而是返回格式化后的文字(该函数把格式化的字符串写写入一个变量中,而不是输出来),其他的与printf一样。

    例如:

    1 $str = "Hello";
    2 $number = 123;
    3 $txt = sprintf("%s world. Day number %u",$str,$number);
    4 //输出: Hello world. Day number 123
    6:var_dump():函数,输出变量的内容、类型或字符串的内容、类型、长度。常用来调试。

    可以通过function_exists('函数名称')进行测试

    1  var_dump(function_exists('print')); //bool(false)
    2  var_dump(function_exists('echo')); //bool(false)
    3  var_dump(function_exists('print_r')); //bool(true)
    View Code
  • 相关阅读:
    PHP 实现 一致性哈希 算法(转的)
    一致性 hash 算法
    分布式设计与开发---宏观概述
    Lvs+keepalived+nginx+php的session 保持的算法
    从零搭建Web网站
    Java动态代理机制详解(JDK 和CGLIB,Javassist,ASM)
    哪个线程执行 CompletableFuture’s tasks 和 callbacks?
    HTTP 用户认证
    java 发送 HTTP 请求
    Http basic Auth 认证方式帮助类
  • 原文地址:https://www.cnblogs.com/jasonxu19900827/p/7611087.html
Copyright © 2011-2022 走看看