php 金额的格式,PHP 4、使用str_replace去除金额格式的逗号以及某数组函数的性能对比...

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++;

}

return $str . '.' . $dot;

}

一般来说,number_format已经够用了,所以,更强大的扩展留给未来的PHPX吧

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值