我想在文本框中输入数字,我的文本框会以逗号(,)格式自动转换。我试图这样做,但它的工作是错误的。帮我?像这样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?
答案 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;
}
}
主要部分是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表单有一个本机控件可以做到这一点。它甚至可能是文本框的属性,我不记得了。