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

ASP.NET DataGrid 顯示小數位數控制完整指南:SQL 端格式化、繫結端格式化、項目繫結事件三大方案

     編輯:關於ASP.NET

需求:將 `125 / 60.00 = 2.083333...` 小時在 DataGrid 中僅顯示 `2.08` (保留兩位小數)。本文彙整三大主流解法:**SQL 查詢端格式化**、**DataGrid 繫結屬性格式化**、**ItemDataBound 事件程式化控制**,並比較優劣適用場景。

方案一:SQL 查詢端格式化 (資料庫層處理)

語法範例結果適用資料庫
`ROUND(value, 2)``SELECT ROUND(125/60.00, 2)``2.08`SQL Server, Oracle, MySQL, PostgreSQL
`CAST(value AS DECIMAL(18,2))``SELECT CAST(125/60.00 AS DECIMAL(18,2))``2.08`標準 SQL (所有主流 DB)
`CONVERT(DECIMAL(18,2), value)``SELECT CONVERT(DECIMAL(18,2), 125/60.00)``2.08`SQL Server, Sybase
`FORMAT(value, 'N2')``SELECT FORMAT(125/60.00, 'N2')``2.08` (字串)SQL Server 2012+
`TRUNCATE(value, 2)``SELECT TRUNCATE(125/60.00, 2)``2.08` (直接截斷)MySQL, PostgreSQL

**優點**:資料傳輸量小、前端無需額外處理、報表匯出一致。
**缺點**:精度在資料庫端截失、不同 DB 語法不一、排序/篩選可能受影響。

方案二:DataGrid 繫結欄位 DataFormatString (宣告式、零代碼)

ASPX 標記

<asp:DataGrid ID="DataGrid1" runat="server" AutoGenerateColumns="False">
  <Columns>
    <asp:BoundColumn 
        DataField="Hours" 
        HeaderText="工時" 
        DataFormatString="{0:F2}" 
        HtmlEncode="False" />
    <!-- F2 = 固定兩位小數;N2 = 含千分位分隔符 -->
  </Columns>
</asp:DataGrid>

關鍵屬性

  • `DataFormatString="{0:F2}"`:標準 .NET 數值格式字串
  • `HtmlEncode="False"`:**必須設為 False**,否則格式化字串會被 HTML 編碼而失效

**常用格式字串**:

格式說明範例 (1234.567)
`{0:F2}`固定 2 位小數`1234.57`
`{0:N2}`含千分位、2 位小數`1,234.57`
`{0:C2}`貨幣格式 (依文化特性)`$1,234.57` / `NT$1,234.57`
`{0:P2}`百分比、2 位小數`123,456.70 %`
`{0:#.##}`最多 2 位小數 (尾端 0 不顯示)`1234.57` / `1234.5` / `1235`

方案三:ItemDataBound 事件程式化控制 (最大彈性)

protected void DataGrid1_ItemDataBound(object sender, DataGridItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
    {
        // 假設 Hours 在第 2 欄 (索引 1)
        decimal hours = Convert.ToDecimal(DataBinder.Eval(e.Item.DataItem, "Hours"));
        e.Item.Cells[1].Text = hours.ToString("F2"); // 或 N2, C2...
        
        // 進階:依條件動態格式
        if (hours > 100) 
            e.Item.Cells[1].CssClass = "overtime-highlight";
    }
}

**優點**:可依資料值動態決定格式、加 CSS Class、加圖示、甚至改寫整個 Cell 內容。
**缺點**:需寫代碼、效能略低於宣告式、維護成本較高。

方案比較與選擇建議

維度SQL 端DataFormatStringItemDataBound
實作難度低 (改 SQL)極低 (屬性設定)中 (寫事件代碼)
維護性分散在 SQL/SP集中在 ASPX集中在 CodeBehind
資料精度保留**截失** (DB 端已四捨五入)**保留** (原始值在 DataItem)**保留**
匯出 Excel/CSV 一致性自動一致需額外處理 (匯出時重新格式化)需額外處理
跨資料庫可移植語法不同**完全相容****完全相容**
動態條件格式化困難 (CASE WHEN)不支援**完美支援**
效能最好 (DB 端完成)極佳 (框架內建)略低 (反射/轉型)

決策樹

需要在匯出/報表/下游系統保持原始精度?
  ├─ 是 → 勿在 SQL 端截斷,改用 DataFormatString 或 ItemDataBound
  └─ 否 → 
      需要動態條件格式 (如負數紅字、超標高亮)?
        ├─ 是 → ItemDataBound
        └─ 否 → DataFormatString (最簡潔、零代碼、效能佳)

常見坑點提醒

  1. 忘記 `HtmlEncode="False"`:格式化後的字串被編碼為 `1234.57` → 顯示失敗
  2. 資料類型不匹配:`DataField` 綁定的是 `String` 而非數值型別,格式化無效 → 確保 SQL 回傳 `DECIMAL`/`FLOAT` 或後台 `Convert.ToDecimal`
  3. 文化特性影響:`{0:N2}` 千分位符號依 `Thread.CurrentThread.CurrentCulture` (台/美制不同) → 明確設定 `CultureInfo` 或用 `{0:F2}` 避免千分位
  4. GridView 相容:`GridView` 同樣支援 `BoundField.DataFormatString` + `HtmlEncode="false"`

現代化對應:Razor / Blazor / 前端格式化

@* Razor Pages / MVC *@
<td>@Model.Hours.ToString("F2")</td>
<td>@String.Format("{0:F2}", Model.Hours)</td>

@* Blazor *@
<td>@hours.ToString("F2")</td>

@* JavaScript (客戶端) *@
cell.textContent = hours.toFixed(2); // 或 toLocaleString(undefined, {minimumFractionDigits: 2})

小數位數控制看似微不足道,卻關係到**資料精度保真、跨層一致性、國際化支援、維護成本**。掌握三大方案優劣,依據「精度保留需求、動態格式化需求、團隊技術棧」三角決策,才能在專案中建立統一、可擴充的格式化規範。

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