str_replace — 子字符串替换
mixed str_replace( mixed $search, mixed $replace, $mixed $subject[, int &$count ] )
该函数返回一个字符串或者数组。该字符串或数组是将
subject
中全部的
search
都被
replace
替换之后的结果。
如果没有一些特殊的替换需求(比如正则表达式),你应该使用该函数替换 ereg_replace() 和 preg_match()
如果
search
和
replace
为数组,那么
str_replace()
将对
subject
做二者的映射替换。如果
replace
的值的个数少于
search
的个数,多余的替换将使用空字符串来进行。如果
search
是一个数组而
replace
是一个字符串,那么
search
中每个元素的替换将始终使用这个字符串。该转换不会改变大小写。
str_replace
传送门
这里我们使用
number_format
函数快速格式化一个数字得到一个金额格式的字符串,这里是
number_format
的
传送门
如
$a = '12312312312312.1231231111111111';
经过
number_format
后
$b = number_format( $a, 2, '.', ',' );
因为只要了小数点两位,所以千分位开始舍去,变成了这个
12,312,312,312,312.12
需要把经过
number_format
格式化好的字符串再变回来,可以使用如下代码
$c = str_replace( ',', '', $b );
现在,有两兄弟表示不服,这么简单的字符串处理工作,用它们俩也可以实现
先上最终代码
$a = '12312312312312.1231231111111111';
$b = number_format( $a, 2, '.', ',' );
echo $b;
echo '
$time1 = microtime( true );
for ( $i = 1; $i <= 100000; $i++ ) {
$c = str_replace( ',', '', $b ); // 直接用str_replace函数进行字符串替换
$time2 = microtime( true );
echo $c, ':', $time2 - $time1;
for ( $i = 1; $i <= 100000; $i++ ) {
$c = implode( '', explode( ',', $b ) ); //使用数组函数分割后拼接得到相似效果
$time3 = microtime( true );
echo '
echo $c, ':', $time3 - $time2;
12,312,312,312,312.12
12312312312312.12:0.27701592445374
12312312312312.12:0.64003705978394[Finished in 1.0s]
这里其实注意到,金额格式的字符串,有个很明显的特征,就是用逗号,
分割,自然想到了数组函数中的implode
和explode
,传送门在此implode、explode
所以可以通过先根据逗号,
拆分出数组,再用空字符串''
拼接,得到想要的结果
只是,两兄弟的速度和str_replace
的比起来,实在……
题外话,implode
由于历史原因,接收两种类型的参数,也就是,两个参数可以换着写,这算是一个比较好玩的地方吧
此外,这里再说一个关于number_format
的一个不算bug的bug:
如果这个数字太长了,后面的值是会被强制变成0的!这……看看number_format
的参数类型就知道,只接收float
,因此这里提供一个可以接收任意字符长度的函数,只是想通过这个函数来说明这个所谓的bug,并不是真的要重写,毕竟,最后的测试结果表明,我写的这个函数效率是number_format
的四分之一……
function a( $a ) {
list($int, $dot) = explode( '.', $a );
$str = '';
$length = strlen( $int );
$pos = 0;
for ( $i = $length - 1; $i >= 0; $i-- ) {
$delimiter = $pos % 3 == 0 && $pos != 0 ? ',' : '';
$str = $int{$i} . $delimiter . $str;
$pos++;