2009年9月24日

利用C#的TextBox來設計避免輸入非數字字元的金錢欄位

設計一個可輸入金額的TextBox,此欄位可依照金錢格式顯示,每三位新增一個逗點,並且禁止輸入與數字無關的字元。這邊利用了TryParse()在轉換字串時的優勢來設計此功能:

private string oldString = ""; //全域變數,儲存先前的textBox1.Text
private void textBox1_TextChanged(object sender, EventArgs e)
{
//避免因為重設相同的值給textBox1.Text時而造成事件發生
if (textBox1.Text.Equals(oldString)) return;
//如果只輸入負號先不處理
if (textBox1.Text.Equals("-")) return;
//存輸入的值
long lTemp = 0;
//暫存游標的位置
int selectStartTemp = textBox1.SelectionStart;
//暫存轉換前textBox1的字串長度
int oriStringLength = textBox1.Text.Length;
//先將之前轉換過的字串還原成數值並存入lTemp
//若無法正常轉換則有兩種狀況要處理
if (!Int64.TryParse(textBox1.Text.Replace(",", "").Replace(" ", ""), out lTemp))
{
//textBox1為空字串時無法轉換,則保留空字串值
if (textBox1.Text.Equals("")) oldString = "";
//textBox為非數字字串時則還原先前的值
else
{
textBox1.Text = oldString;
textBox1.SelectionStart =
selectStartTemp - (oriStringLength - oldString.Length);
}
return;
}
//轉換成金錢格式,注意這裡是使用N0,使用沒有小數點的金錢格式
textBox1.Text = string.Format("{0:N0}", lTemp);
//若轉換後的字串長度比轉換前大,表示多了逗號,需要修正游標位置
if (textBox1.Text.Length > oriStringLength)
selectStartTemp += textBox1.Text.Length - oriStringLength;
oldString = textBox1.Text;
//指定游標到正確位置
textBox1.SelectionStart = selectStartTemp;
}


使用這個方法還有一個好處,就是不會發生溢位,本來是沒有考慮溢位的狀況,一開始還以為設定到textBox1的MaxLength,慢慢檢查才發現是因為TryParse在轉換字串時失敗的關係,真是誤打誤撞~ :p