2013-10-07 43 views
1

我有一個困擾了我一段時間的問題。我嘗試了一些解決方案,但他們沒有奏效。價格/現金/ C上的貨幣的文本框#

我有一個用於現金輸入的文本框(例如999,99美元)。不過,我需要自動輸入「,」和「。」。正確顯示值。

我嘗試了兩種解決方案。其中之一是這樣的:

private void tx_ValorUnidade_TextChanged(object sender, EventArgs e) 
    { 
     string value = tx_ValorUnidade.Text.Replace(",", "").Replace("R$", ""); 
     decimal ul; 
     //Check we are indeed handling a number 
     if (decimal.TryParse(value, out ul)) 
     { 
      //Unsub the event so we don't enter a loop 
      tx_ValorUnidade.TextChanged -= tx_ValorUnidade_TextChanged; 
      //Format the text as currency 
      tx_ValorUnidade.Text = string.Format(System.Globalization.CultureInfo.CreateSpecificCulture("pt-BR"), "{0:C2}", ul); 
      tx_ValorUnidade.TextChanged += tx_ValorUnidade_TextChanged; 
     } 
    } 

然而,結果是非常奇怪的。詞可能無法就這一個,所以我錄製的視頻:http://www.screenr.com/2sLH

另一種是這樣的:

private void tx_ValorUnidade_KeyUp(object sender, KeyEventArgs e) 
    { 
      if (!string.IsNullOrEmpty(tx_ValorUnidade.Text)) 
      { 
       System.Globalization.CultureInfo culture = new System.Globalization.CultureInfo("en-US"); 
       int valueBefore = Int32.Parse(tx_ValorUnidade.Text, System.Globalization.NumberStyles.AllowThousands); 
       tx_ValorUnidade.Text = String.Format(culture, "{0:N0}", valueBefore); 
       tx_ValorUnidade.Select(tx_ValorUnidade.Text.Length, 0); * 
      } 
    } 

這一個有點兒工作,但有一個問題:如果用戶想要插入somethink像$ 10,00它不能。它也在5個數字後崩潰。一個視頻到:http://www.screenr.com/1sLH

作爲原始參考,我從otherquestions這裏得到了2個代碼。

我該如何解決?我使用的例子錯了嗎?任何想法都是可喜的。

回答

6

我認爲,當用戶移動到下一個控件時,例如格式化會更好。如下所示。否則,這將是非常令人混淆,因爲當用戶鍵入文本將改變自己:

private void textBox1_Leave(object sender, EventArgs e) 
    { 
     Double value; 
     if (Double.TryParse(textBox1.Text, out value)) 
      textBox1.Text = String.Format(System.Globalization.CultureInfo.CurrentCulture, "{0:C2}", value); 
     else 
      textBox1.Text = String.Empty; 
    } 
7

有些人可能會想,因爲他們鍵入實際格式化文本框。所以這是我的解決方案,如果有人正在尋找一個。

它實際上假定你是在一個時間,因此輸入一個數字,你按下「」它假定「$ 0.01」,當他們按「」它然後假定「$ 0.12」和等等等等。

我找不到任何關於輸入格式的信息。它已經過測試,如果有任何錯誤讓我知道。

private void textBox1_TextChanged(object sender, EventArgs e) 
{ 
    //Remove previous formatting, or the decimal check will fail including leading zeros 
    string value = textBox1.Text.Replace(",", "") 
     .Replace("$", "").Replace(".", "").TrimStart('0'); 
    decimal ul; 
    //Check we are indeed handling a number 
    if (decimal.TryParse(value, out ul)) 
    { 
     ul /= 100; 
     //Unsub the event so we don't enter a loop 
     textBox1.TextChanged -= textBox1_TextChanged; 
     //Format the text as currency 
     textBox1.Text = string.Format(CultureInfo.CreateSpecificCulture("en-US"), "{0:C2}", ul); 
     textBox1.TextChanged += textBox1_TextChanged; 
     textBox1.Select(textBox1.Text.Length, 0); 
    } 
    bool goodToGo = TextisValid(textBox1.Text); 
    enterButton.Enabled = goodToGo; 
    if (!goodToGo) 
    { 
     textBox1.Text = "$0.00"; 
     textBox1.Select(textBox1.Text.Length, 0); 
    } 
} 

private bool TextisValid(string text) 
{ 
    Regex money = new Regex(@"^\$(\d{1,3}(\,\d{3})*|(\d+))(\.\d{2})?$"); 
    return money.IsMatch(text); 
} 

爲了使它看起來不錯,我建議先從像這樣的形式加載文本$ 0.00文本框:

private void Form1_Load(object sender, EventArgs e) 
    { 
     textBox1.Text = "$0.00"; 
     textBox1.SelectionStart = inputBox.Text.Length; 
    } 
+0

不幸的是它不適用於Compact Framework – dzerow

1

只是輕微修改GreatNates回答。

private bool KeyEnteredIsValid(string key) 
{ 
    Regex regex; 
    regex = new Regex("[^0-9]+$"); //regex that matches disallowed text 
    return regex.IsMatch(key); 
} 

並將此方法插入文本框預覽輸入事件中,如下所示。

private void TextBox1_PreviewTextInput(object sender, TextCompositionEventArgs e) 
{ 
    e.Handled = KeyEnteredIsValid(e.Text); 
} 

這樣你就可以確保在輸入任何東西時不會犯任何錯誤。你僅限於使用我的方法的數字,而nates方法正在格式化你的字符串。

乾杯。

+0

不幸的是,這個代碼在Compact Framework中不起作用 – dzerow

0

我們也可以嘗試下面的一個。

txtCost.Text = String.Format("{0:c2}", myObj.Cost);