金融、會計領域常需將數字字串每三位插入逗號(千分位格式)。本文實作一個通用函數 splitStrWithComma(),支援任意長度分割與自訂分隔符,並修正原文演算法的反轉邏輯錯誤。
<?php
/**
* 從右向左每 $groupLen 字元插入 $separator
*
* @param string $str 原始字串
* @param int $groupLen 分組長度(預設 3)
* @param string $separator 分隔符(預設 ',')
* @return string 格式化後字串
*/
function chunkStringFromRight(string $str, int $groupLen = 3, string $separator = ','): string {
if ($groupLen <= 0) return $str;
$len = strlen($str);
if ($len <= $groupLen) return $str;
// 從右向左切片
$chunks = [];
for ($i = $len; $i > 0; $i -= $groupLen) {
$start = max(0, $i - $groupLen);
$chunks[] = substr($str, $start, $i - $start);
}
// 反轉片段順序並連接
return implode($separator, array_reverse($chunks));
}
// 測試
echo chunkStringFromRight('1234567890') . "\n"; // 1,234,567,890
echo chunkStringFromRight('1234567890', 4, ' ') . "\n"; // 12 3456 7890
echo chunkStringFromRight('abcdefgh', 2, '-') . "\n"; // ab-cd-ef-gh
?>
$i = $j 導致無限迴圈風險)。strrev() 或 array_reverse() 替代。substr() 切片 + implode() 方式,語意清晰且效能佳。<?php
// 專為數字千分位設計
echo number_format(1234567890) . "\n"; // 1,234,567,890
echo number_format(1234.56, 2, '.', ',') . "\n"; // 1,234.56
// 通用字串分組(PHP 7.4+)
echo implode(',', str_split('1234567890', 3)) . "\n"; // 123,456,789,0 (從左向右,非千分位)
?>
number_format() 為數字格式化首選;通用字串分組需自行實作從右向左邏輯。
chunkStringFromRight() 以簡潔演算法實現通用字串分組格式化,適用於千分位、信用卡號掩碼、Base64 分行等場景。希望本文對您的 PHP 程式設計有所幫助。