0

我想在文本框中输入数字,我的文本框会自动将其转换为逗号(,)格式。我试图这样做,但它工作错了。帮我?像这样 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?

4

3 回答 3

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

例子

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

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

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

于 2012-08-10T22:13:48.887 回答
1

你想要的是一个MaskedTextBox

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

于 2012-08-10T21:42:02.460 回答
-1

好吧,乍一看,我注意到您的代码没有任何意义。

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

接下来,这一行:

if (!IsNumeric(KeyCode){

说:如果键码不是数字,请执行以下操作,其中“以下内容”是对假定为数字的键码的一大堆数字操作。

接下来,str没有在您的方法中的任何地方定义。也许它是在全球范围内定义的,但这很愚蠢。相反,您应该以编程方式获取它的当前值。

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

于 2012-08-10T21:46:34.073 回答