2010/07/28

[C#] 使用 Regex 將 0123456789 轉成中文

有時在處理數字的顯示時, 會有一種需求是希望將 "第123期" 轉為 "第一二三期", 或是將其轉為 "第壹貳參期".
像這種一對一的轉換, 有一種寫法如下:

string sInput = "045";
string strResult2 = sInput.Replace("0", "0").Replace("1", "一")
  .Replace("2", "二").Replace("3", "三")
  .Replace("4", "四").Replace("5", "五")
  .Replace("6", "六").Replace("7", "七")
  .Replace("8", "八").Replace("9", "九");
這樣的寫法看起來會有點麻煩, 不過卻是最常被使用的做法.
若是用 Regex 做, 看起來會簡潔一點:
string sInput = "045";
string strResult = Regex.Replace(sInput, ".",
  delegate(Match m)
  {
     return "0一二三四五六七八九"[m.Value[0] - '0'].ToString();
  });
第 2 行設定 ".", 目的是要將 sInput 中所有的字元做取代.
如果字串中有其他的字元, 保險一點可以設定為 "[\\d]", 也就是只抓數字 (0-9).
第5行是將找到的字串值 (m.Value[0]), 例如 "0", "4", "5", 做為 "0一二三四五六七八九"這個字串的索引值, 然後取出 "0","四","五".
在取索引值的部分, 可以利用 int.Parse(m.Value[0].ToString()), 將 m.Value[0]轉成數字.
也可以使用字元整數值的相減, 將數字字元 ('0', '1', '2', etc) 減去 '0'(char=48), 得到 0, 1, 2, etc.
同樣道理, 也可替換為 "零壹貳參肆伍陸柒捌玖".

沒有留言: