2

我有一个困扰我一段时间的问题。我尝试了一些解决方案,但没有奏效。

我有一个用于现金输入的文本框(例如 $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;
        }
    }

然而,结果非常奇怪。

另一个是这样的:

    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); *
          }
    }

这有点工作,但有一个问题:如果用户想插入一些像 10,00 美元的东西,它不能。它也会在 5 个数字后崩溃。

作为原始参考,我从此处的其他 问题中获得了 2 个代码。

我该如何解决?我使用的例子错了吗?欢迎任何想法。

4

6 回答 6

12

有些人可能希望在键入时实际格式化文本框。因此,如果有人正在寻找,这就是我的解决方案。

它实际上假设您一次输入一个数字,因此当您按下“ 1 ”时,它假定“ 0.01 美元”,当他们按下“ 2 ”时,它假定“ 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;
    }
于 2013-12-02T16:46:17.587 回答
11

我认为当用户移动到下一个控件时格式化时你会更好,例如如下所示。否则它会非常混乱,因为文本会在用户输入时自行改变:

    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;
    }
于 2013-10-07T02:01:42.040 回答
2

只需对 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 方法正在格式化您的字符串。

干杯。

于 2014-01-09T12:22:35.087 回答
1

我们也可以尝试关注一个。

txtCost.Text = String.Format("{0:c2}", myObj.Cost);
于 2018-01-18T10:30:33.840 回答
0

我也为此苦苦挣扎了好几个小时。我尝试使用 maskedTextBox 但这对于用户输入文本来说很笨重。我也不喜欢处理计算的掩蔽。我还研究了使用数据绑定格式,但这似乎有点矫枉过正。

我最终采用的方法是不使用 TextBox 输入数字。请改用 NumericUpDown 对象。无需转换,您可以根据需要在属性中设置小数点和千位逗号;)我将增量设置为 1000,因为我正在处理收入问题。

请注意,当有小数点和超过 1000 (即 1,000.01) 的金额时,通过的 .Text 将带有逗号,否则将删除小数点和尾随的 0。

我还发现这个简短而甜蜜的解决方案效果很好,但对 numericUpDown 来说是不必要的。您可以将此放在休假事件中。

 Decimal val;
if (Decimal.TryParse(TxtCosPrice.Text, out val))
    TxtCosPrice.Text = val.ToString("C");
else
    MessageBox.Show("Oops!  Bad input!");
于 2018-04-04T15:34:16.900 回答
0

这是我的解决方案,它只放点,而不是钱符号。希望可以帮助别人。

    private void textBox1_KeyUp(object sender, KeyEventArgs e)
        {
        e.SuppressKeyPress = TextBox2Currency((TextBox)sender, e.KeyValue);
        }

    private bool TextBox2Currency(TextBox sender,int keyval)
        {
        if ((keyval >= 48 && keyval <= 58) || keyval == 46 || keyval == 8)
            {
            int pos = sender.SelectionStart;
            int oriLen = sender.Text.Length;
            string currTx = sender.Text.Replace(".", "").ToCurrency();
            int modLen = currTx.Length;
            if (modLen != oriLen)
                pos += (modLen - oriLen);
            sender.Text = currTx;
            if ( pos>=0)
                sender.SelectionStart = pos;
            return false;
            }
        return true;
        }
于 2018-04-15T17:38:35.720 回答