首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 依指定長度分割字串並插入分隔符(如千分位格式化)

     編輯:PHP 相關知識

前言

金融、會計領域常需將數字字串每三位插入逗號(千分位格式)。本文實作一個通用函數 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 4.3+)

<?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 程式設計有所幫助。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved