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

ASP.NET 字串截取與自動換行實用方法:超過長度截斷、加上省略號、支援多行

     編輯:關於ASP.NET

Web 開發中常需在 GridView、Repeater、ListView 等控制項顯示不定長度文字,超過寬度需自動換行或截斷加上省略號 (`...`)。本文提供兩個實用的靜態方法:`CutStr` (純換行) 與 `CutStr` 多載 (長度限制 + 省略號),並分析其邏輯、效能與現代 CSS 替代方案。

方法一:純自動換行 (不限制總長度)

/// 
/// 將字串每 len 字元換行,不限制總長度
/// 
/// 原始字串
/// 每行字元數
/// 含換行字元的字串
public static string CutStr(string str, int len)
{
    if (string.IsNullOrEmpty(str) || len <= 0) return str;
    
    var sb = new System.Text.StringBuilder();
    for (int i = 0; i < str.Length; i += len)
    {
        int remaining = str.Length - i;
        int take = Math.Min(len, remaining);
        sb.Append(str.Substring(i, take));
        if (i + take < str.Length) sb.Append("
"); // HTML 換行 } return sb.ToString(); }

方法二:限制最大長度 + 省略號 + 自動換行

/// 
/// 截取字串至最大長度,超過加省略號,並每 len 字元換行
/// 
/// 原始字串
/// 每行字元數
/// 最大輸出長度 (含省略號)
/// 處理後字串
public static string CutStr(string str, int len, int max)
{
    if (string.IsNullOrEmpty(str) || len <= 0 || max <= 0) return str;
    
    // 先截取至最大長度
    if (str.Length > max)
    {
        str = str.Substring(0, max - 3) + "..."; // 預留 3 字元給省略號
    }
    
    // 再依 len 換行
    var sb = new System.Text.StringBuilder();
    for (int i = 0; i < str.Length; i += len)
    {
        int remaining = str.Length - i;
        int take = Math.Min(len, remaining);
        sb.Append(str.Substring(i, take));
        if (i + take < str.Length) sb.Append("
"); } return sb.ToString(); }

使用範例

string longText = "這是一段很長的文字內容,用來示範自動換行與截斷省略號的效果。";

// 每 10 字元換行
lbl1.Text = CutStr(longText, 10);
// 輸出:這是一段很長
的文字內容,用
來示範自動換
行與截斷省略
號的效果。 // 最大 30 字元,每 10 字元換行 lbl2.Text = CutStr(longText, 10, 30); // 輸出:這是一段很長的文
字內容,用來示範...

邏輯分析與改進點

原始碼特徵問題改進版處理
雙重迴圈、模運算判斷換行邏輯複雜、難閱讀、效能較差單一迴圈 `i += len` 步進,清晰高效
直接回傳 `
`
耦合 HTML、無法用於純文字/JSON參數化 `separator` (預設 `
`),支援 `\n`、`Environment.NewLine`
省略號硬編碼 `...`無法自訂 (如 `…`、`[更多]`)參數化 `ellipsis`
未處理 HTML 標籤截斷可能切斷 ``、`` 導致版面崩壞建議搭配 `HtmlAgilityPack` 或 `HttpUtility.HtmlEncode` 先編碼
中英文混排視覺寬度不一字元數 ≠ 顯示寬度進階版可依 `TextRenderer.MeasureText` 或 CSS `text-overflow` 處理

增強版:支援自訂分隔符、省略符、HTML 編碼

public static string CutStr(
    string str, 
    int lineLength, 
    int? maxLength = null, 
    string lineSeparator = "
", string ellipsis = "...", bool htmlEncode = true) { if (string.IsNullOrEmpty(str) || lineLength <= 0) return str; if (htmlEncode) str = System.Web.HttpUtility.HtmlEncode(str); if (maxLength.HasValue && str.Length > maxLength.Value) { int cutLen = Math.Max(0, maxLength.Value - ellipsis.Length); str = str.Substring(0, cutLen) + ellipsis; } var sb = new System.Text.StringBuilder(); for (int i = 0; i < str.Length; i += lineLength) { int take = Math.Min(lineLength, str.Length - i); sb.Append(str.Substring(i, take)); if (i + take < str.Length) sb.Append(lineSeparator); } return sb.ToString(); }

現代化最佳實踐:CSS 取代伺服器端截斷

.text-truncate {
    display: -webkit-box;
    -webkit-line-clamp: 3;     /* 顯示 3 行 */
    -webkit-box-orient: vertical;
    overflow: hidden;
    text-overflow: ellipsis;
    word-break: break-all;     /* 中文強制斷字 */
}

/* 單行省略 */
.single-line {
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
<asp:Label ID="lblDesc" runat="server" CssClass="text-truncate" 
    Text='<%# Eval("Description") %>' />

選擇指南

場景推薦方案
純文字郵件/簡訊/報表匯出伺服器端 `CutStr` (無 CSS 支援)
GridView/Repeater 一般文字欄位CSS `text-overflow` + `line-clamp`
含 HTML 標籤的富文本摘要伺服器端 `HtmlAgilityPack` 截斷 + CSS 雙重保險
多語言/混排/精確視覺寬度Canvas `measureText` / JavaScript 客戶端計算
PDF/列印輸出伺服器端精確排版 (iTextSharp/QuestPDF)

字串截取看似瑣碎,卻關係到資料呈現品質、使用者體驗、甚至安全性 (防 XSS)。掌握伺服器端邏輯與客戶端 CSS 的分工協作,並根據輸出媒介選擇適當策略,是資深 Web 開發者的基本功。

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