【问题标题】:how to currency format under textbox?如何在文本框下进行货币格式?
【发布时间】:2015-08-16 19:42:41
【问题描述】:

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

【问题讨论】:

  • 疯狂的缩进是怎么回事?
  • 您在某处错误地指定了 Substring 的参数。另外,为什么不直接使用内置的数字格式化功能呢?
  • 我正在做现金柜台程序,这就是我需要它的原因。对于 exp:总价为 10,50,我需要写入文本框 1050,但文本框会自动将其转换为相同的数字;

标签: c#


【解决方案1】:

你想要的是MaskedTextBox

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

【讨论】:

    【解决方案2】:

    我原本打算建议使用 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} 将字符串格式化为货币 (:C) 到 2 个小数位 (2) 的数字 (0)。

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

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

    【讨论】:

    • 嗨,我正在尝试您的解决方法,但输入错误,从输入的第一个数字开始正常,'3' 变成 '$3,00' 这没关系,但如果我然后输入 '5' 我得到 '$5.300,00' 并且我继续输入的每个数字在开始时都会出现,我还尝试了另一种字符串格式:tb.Text = ul.ToString("C", CultureInfo.CreateSpecificCulture("en-US) "));没有运气,你的代码工作正常还是我做错了什么?谢谢。
    • 您删除格式的行将我的第一个输入保留为“300”,这就是为什么如果我稍后输入“5”我会得到 5300,因此当再次应用格式时会得到 5.300,00 美元。我发现很难对文本更改应用格式,但对我来说,这是要走的路,因为我 maskedTextBox 会在提示字符中留下空格,这并不像你在开始时所说的那样好。
    • 你好,我只是想告诉你,我可以让它在不需要 MTB 的情况下工作,当然它有点脏,但它确实可以自动格式化货币非常好,能够正确使用小数分隔符,我现在知道选择位置是最棘手的事情,但它很好用,如果你有兴趣,现在让我来改进它,干杯。啊。
    【解决方案3】:

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

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

    接下来,这一行:

    if (!IsNumeric(KeyCode){
    

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多