如何在文本框下进行货币格式化?

时间:2012-08-10 21:23:29

标签: c#

我想在文本框中输入数字,我的文本框会以逗号(,)格式自动转换。我试图这样做,但它的工作是错误的。帮我?像这样1,20(我只输入120);

private bool IsNumeric(int Val)
{
    return ((Val >= 48 && Val <= 57) || (Val == 8) || (Val == 46));
}
String str;
private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
    int KeyCode = e.KeyValue;
    if (!IsNumeric(KeyCode))
    {
        if (KeyCode == 13)
        {
            e.Handled = true;
            vendas();
            str = null;
        }
        e.Handled = true;
        return;

    }
    else
    {
        e.Handled = true;
    }
    if (((KeyCode == 8) || (KeyCode == 46)) && (str.Length > 0))
    {
        str = str.Substring(0, str.Length - 1);
    }
    else if (!((KeyCode == 8) || (KeyCode == 46)))
    {
        str = str + Convert.ToChar(KeyCode);
    }

    if (str.Length == 0)
    {
        textBox1.Text = "";
    }
    if (str.Length == 1)
    {
        textBox1.Text = "0,0" + str;
    }
    else if (str.Length == 2)
    {
        textBox1.Text = "0," + str;
    }
    else if ((str.Length > 2) && (str.Length != 6) && (str.Length != 9) && (str.Length != 12))
    {
        textBox1.Text = str.Substring(0, str.Length - 2) + "," + str.Substring(str.Length - 2);
        textBox1.Text = textBox1.Text;
    }
    else if ((str.Length > 6) && (str.Length != 8) && (str.Length != 10) && (str.Length != 12))
    {
        textBox1.Text = str.Substring(0, str.Length - 3) + "," + str.Substring(str.Length - 1);
        textBox1.Text = textBox1.Text;
    }
}

它显示10,01而不是0,01?

3 个答案:

答案 0 :(得分:1)

你想要的是MaskedTextBox

只需设置"$999,999,990.00"的掩码,用户输入的任何输入都必须是数字,并且必须至少有3个,但条目可以是任意数字,最高可达数亿(如果您需要数十亿和数万亿,只需添加更多9和逗号)。当用户输入这些数字时,格式将根据掩码进行调整。这是踢球者; MaskedTextBox尊重文化信息,因此如果指定法国文化,则逗号变为空格,小数变为逗号,美元符号变为欧元符号。

答案 1 :(得分:1)

我原本打算建议使用MaskedTextBox,但是MTB是针对固定(或高级,至少已知)长度字符串的从左到右样式格式设计的,这使得它不太适合货币。

首先,我建议你不要使用密钥代码等做任何事情,只要在文本发生变化时验证和编辑文本就可以更直接地坚持下去:

    void tb_TextChanged(object sender, EventArgs e)
    {
          //Remove previous formatting, or the decimal check will fail
      string value = tb.Text.Replace(",", "").Replace("$", "");
      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
        tb.TextChanged -= tb_TextChanged;
            //Format the text as currency
        tb.Text = string.Format(CultureInfo.CreateSpecificCulture("en-US"), "{0:C2}", ul);
        tb.TextChanged += tb_TextChanged;
      }
    }

example

主要部分是string.Format(CultureInfo.CreateSpecificCulture("en-US"), "{0:C2}", ul); en-US确保它总是将$和decmials显示为'。'。 {0:C2}将字符串格式化为货币(0)的数字(:C)到2个十进制空格(2)。

这不会阻止用户输入文本,但您可以保留以前的文本(例如'$ 23.00'),如果用户输入的内容不是数字,则decimal.TryParse将失败,此时您可以恢复文本回到用户更改之前的状态(只需在此事件处理程序的末尾附近插入一个else块)。

我建议最初将TB文本设置为'$ 0.00'或其他东西,否则当格式化第一次更改时光标会跳转。在添加逗号时它也有一些选择问题,你可以通过在格式化之前存储选择位置并在之后更改它来解决,或者做一些更复杂的事情,这只是一个例子。

答案 2 :(得分:-1)

嗯,乍一看,我注意到你的代码没有任何意义。

首先,学习缩进的编码标准。这段代码非常难以阅读。我很想把这个问题标记为冒犯,因为我不得不看一眼。

接下来,这一行:

if (!IsNumeric(KeyCode){

说:如果键码不是数字,请执行以下操作,其中&#34;以下内容&#34;是键码上的一大堆数字运算,它被假定为数字。

接下来,str未在您的方法中的任何位置定义。也许它是全球定义的,但这只是愚蠢的。相反,您应该以编程方式获取它的当前值。

最后: 你不需要重新发明轮子。有很多工具可以为你做这种事情。事实上,我相当确定win表单有一个本机控件可以做到这一点。它甚至可能是文本框的属性,我不记得了。