C#UWP如何键入数字字符串并按顺序实时获取逗号?

时间:2019-01-01 07:29:28

标签: c# uwp

我正在尝试在文本框中键入数字,并让它实时在每第三个数字后添加一个逗号。我需要将数字字符串转换为实数,因为我还需要实时执行一个简单的数学方程式。我遇到的一个问题是,如果我在按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");
            }
        }

1 个答案:

答案 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)。