我正在尝试在文本框中键入数字,并让它实时在每第三个数字后添加一个逗号。我需要将数字字符串转换为实数,因为我还需要实时执行一个简单的数学方程式。我遇到的一个问题是,如果我在按4后按1234567的顺序键入,则会添加逗号,然后输入框会跳至字符串的开头。所以我输入1到7,我得到 5,671,234
private void PriceBox_TextChanging(TextBox sender, TextBoxTextChangingEventArgs args)
{
if (!String.IsNullOrEmpty(PriceBox.Text))
{
int x = Int32.Parse(PriceBox.Text, NumberStyles.AllowThousands);
float y = x * .50f;
Half.Text = y.ToString("N0");
PriceBox.Text = x.ToString("N0");
}
}
答案 0 :(得分:2)
您可以按照here的说明,将数字格式化为每3位后有逗号。一种方法是挂接TextChanged
事件,将当前数字转换为逗号分隔的数字,然后将当前文本替换为逗号分隔的数字。
此外,要停止ovetflow异常,您必须取消订阅TextChanged
事件,然后再次订阅。
总事件处理程序在这里:
private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
{
TextBox textBox = sender as TextBox;
/// unsubscribe, so that the replacing doesn't invoke this handler again
textBox.TextChanged -= TextBox_TextChanged;
if(double.TryParse(textBox.Text, out double value))
{
textBox.Text = value.ToString("N0");
}
/// put the cursor in the end of the text
textBox.Select(textBox.Text.Length, 0);
/// subscribe again
textBox.TextChanged += TextBox_TextChanged;
}
希望有帮助。
编辑:
要仅允许数字值,请钩住PreviewKeyDown
事件,仅允许数字键。像这样:
private void TextBox_PreviewKeyDown(object sender, KeyRoutedEventArgs e)
{
bool proceed =
(e.Key >= Windows.System.VirtualKey.Number0 && e.Key <= Windows.System.VirtualKey.Number9) ||
(e.Key >= Windows.System.VirtualKey.NumberPad0 && e.Key <= Windows.System.VirtualKey.NumberPad9);
e.Handled = !proceed;
}
最后,为了允许超过3个逗号,我编辑了代码,现在应该允许超过3个逗号(基本上,我将int
替换为double
)。