程式開發中經常遇到數字格式化、精度控制、金額大寫轉換等需求。本文整理幾個常用的數字處理技巧,提供可直接引用的工具方法。
標準 Math.Round 採用銀行家演算法 (四捨六入五成雙),若需傳統四捨五入,可使用以下方法:
///
/// 傳統四捨五入
///
/// 目標數值
/// 保留小數位數
/// 四捨五入後的數值
public static double RoundTraditional(double d, int i)
{
double factor = Math.Pow(10, i);
double sign = Math.Sign(d);
return sign * Math.Floor(Math.Abs(d) * factor + 0.5) / factor;
}
將數字金額轉換為中文大寫格式 (如:1234566789 → 壹拾貳億三仟肆佰伍拾陸萬陸仟柒佰捌拾玖元)
///
/// 金額轉中文大寫
///
/// 數字字串 (可含小數點)
/// 中文大寫金額字串
public static string ConvertToChineseCurrency(string amount)
{
string[] units = { "分", "角", "元", "拾", "佰", "仟", "萬", "拾", "佰", "仟", "億", "拾", "佰", "仟", "兆" };
string[] digits = { "零", "壹", "貳", "參", "肆", "伍", "陸", "柒", "捌", "玖" };
// 處理小數點
int dotIndex = amount.IndexOf('.');
string integerPart, decimalPart = "";
if (dotIndex >= 0)
{
integerPart = amount.Substring(0, dotIndex);
decimalPart = amount.Substring(dotIndex + 1).PadRight(2, '0').Substring(0, 2);
}
else
{
integerPart = amount;
}
StringBuilder result = new StringBuilder();
// 整數部分
for (int i = 0; i < integerPart.Length; i++)
{
int digit = integerPart[integerPart.Length - 1 - i] - '0';
if (digit != 0 || (i == 0 && integerPart.Length == 1))
{
result.Insert(0, units[i]);
result.Insert(0, digits[digit]);
}
else if (i == 0 || i == 2 || i == 6 || i == 10) // 萬、億等單位
{
result.Insert(0, units[i]);
}
}
// 小數部分
if (decimalPart.Length > 0)
{
for (int i = 0; i < decimalPart.Length; i++)
{
int digit = decimalPart[i] - '0';
if (digit != 0)
{
result.Append(digits[digit]);
result.Append(units[1 - i]); // 角、分
}
}
}
// 處理連續零、尾部零等格式微調
string str = result.ToString();
str = str.Replace("零零", "零").Replace("零萬", "萬").Replace("零億", "億").Replace("零兆", "兆");
if (str.EndsWith("零")) str = str.TrimEnd('零');
if (str.StartsWith("元")) str = str.Substring(1); // 純小數情況
return str + (str.Contains("元") ? "" : "元");
}
public static class NumericExtensions
{
/// 判斷是否為數值字串
public static bool IsNumeric(this string s) => double.TryParse(s, out _);
/// 安全轉換為 Int,失敗回傳預設值
public static int ToInt(this string s, int defaultValue = 0) => int.TryParse(s, out var v) ? v : defaultValue;
/// 格式化為千分位字串
public static string ToThousandSeparated(this decimal d) => d.ToString("N0");
/// 限制小數位數 (截斷而非四捨五入)
public static decimal TruncateDecimals(this decimal d, int places)
{
decimal factor = (decimal)Math.Pow(10, places);
return Math.Truncate(d * factor) / factor;
}
}
掌握這些數字處理技巧,能有效解決金融、報表、匯入匯出等常見業務場景的格式化需求。建議將常用方法封裝為靜態工具類或擴充方法,提升團隊開發效率與程式碼一致性。