str_replace — 子字符串替換
mixed str_replace( mixed $search, mixed $replace, $mixed $subject[, int &$count ] )
該函數(shù)返回一個(gè)字符串或者數(shù)組硕并。該字符串或數(shù)組是將 subject
中全部的 search
都被 replace
替換之后的結(jié)果法焰。
如果沒有一些特殊的替換需求(比如正則表達(dá)式),你應(yīng)該使用該函數(shù)替換 ereg_replace() 和 preg_match()
參數(shù)
如果 search
和 replace
為數(shù)組倔毙,那么 str_replace() 將對(duì) subject
做二者的映射替換埃仪。如果 replace
的值的個(gè)數(shù)少于 search
的個(gè)數(shù),多余的替換將使用空字符串來進(jìn)行陕赃。如果 search
是一個(gè)數(shù)組而 replace
是一個(gè)字符串贵试,那么 search
中每個(gè)元素的替換將始終使用這個(gè)字符串。該轉(zhuǎn)換不會(huì)改變大小寫凯正。
str_replace
傳送門
這里我們使用number_format
函數(shù)快速格式化一個(gè)數(shù)字得到一個(gè)金額格式的字符串,這里是number_format
的傳送門
如$a = '12312312312312.1231231111111111';
經(jīng)過number_format
后$b = number_format( $a, 2, '.', ',' );
因?yàn)橹灰诵?shù)點(diǎn)兩位豌蟋,所以千分位開始舍去廊散,變成了這個(gè)12,312,312,312,312.12
需要把經(jīng)過number_format
格式化好的字符串再變回來,可以使用如下代碼$c = str_replace( ',', '', $b );
現(xiàn)在梧疲,有兩兄弟表示不服允睹,這么簡(jiǎn)單的字符串處理工作,用它們倆也可以實(shí)現(xiàn)
先上最終代碼
$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函數(shù)進(jìn)行字符串替換
}
$time2 = microtime( true );
echo $c, ':', $time2 - $time1;
for ( $i = 1; $i <= 100000; $i++ ) {
$c = implode( '', explode( ',', $b ) ); //使用數(shù)組函數(shù)分割后拼接得到相似效果
}
$time3 = microtime( true );
echo '
';
echo $c, ':', $time3 - $time2;
結(jié)果
12,312,312,312,312.12
12312312312312.12:0.27701592445374
12312312312312.12:0.64003705978394[Finished in 1.0s]
這里其實(shí)注意到幌氮,金額格式的字符串缭受,有個(gè)很明顯的特征,就是用逗號(hào)
,
分割该互,自然想到了數(shù)組函數(shù)中的implode
和explode
米者,傳送門在此implode、explode所以可以通過先根據(jù)逗號(hào)
,
拆分出數(shù)組,再用空字符串''
拼接蔓搞,得到想要的結(jié)果只是胰丁,兩兄弟的速度和
str_replace
的比起來,實(shí)在……題外話喂分,
implode
由于歷史原因锦庸,接收兩種類型的參數(shù),也就是蒲祈,兩個(gè)參數(shù)可以換著寫甘萧,這算是一個(gè)比較好玩的地方吧此外,這里再說一個(gè)關(guān)于
number_format
的一個(gè)不算bug的bug:
如果這個(gè)數(shù)字太長(zhǎng)了梆掸,后面的值是會(huì)被強(qiáng)制變成0的扬卷!這……看看number_format
的參數(shù)類型就知道,只接收float
沥潭,因此這里提供一個(gè)可以接收任意字符長(zhǎng)度的函數(shù)邀泉,只是想通過這個(gè)函數(shù)來說明這個(gè)所謂的bug,并不是真的要重寫钝鸽,畢竟汇恤,最后的測(cè)試結(jié)果表明,我寫的這個(gè)函數(shù)效率是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
已經(jīng)夠用了因谎,所以,更強(qiáng)大的擴(kuò)展留給未來的PHPX吧