当前位置: 首页 > 知识库问答 >
问题:

强制文本框接受十进制

汪信鸥
2023-03-14

我的问题简而言之:

double number = 0;
bool isSuccessful = double.TryParse(e.Text, out number);
e.Handled = !(number >= 0 && isSuccessful);
string validNumberFormat = @"^[-+]?(\d{1,3}((,\d{3})*(\.\d+)?|([.\s]\d{3})*(,\d+)?)|\d+([,\.]\d+)?)$";
e.Handled  = Regex.Matches(e.Text, validNumberFormat).Count < 1;

任何建议都是非常欢迎的。

共有1个答案

潘意
2023-03-14

使用行为(混合SDK System.Windows.Interactivity)而不是直接处理PreviewTextInput。我这样做是因为可重用性,而且您应该知道空间不是用TextInput处理的,粘贴也不是处理的。顺便说一句,我认为乔纳森和菲利斯·波利亚诺是对的,关于你的“小数点”问题。

public class TextBoxInputBehavior : Behavior<TextBox>
{
    public TextBoxInputMode InputMode { get; set; }

    public TextBoxInputBehavior()
    {
        this.InputMode = TextBoxInputMode.None;
    }

    protected override void OnAttached()
    {
        base.OnAttached();
        AssociatedObject.PreviewTextInput += AssociatedObjectPreviewTextInput;
        AssociatedObject.PreviewKeyDown += AssociatedObjectPreviewKeyDown;

        DataObject.AddPastingHandler(AssociatedObject, Pasting);

    }

    protected override void OnDetaching()
    {
        base.OnDetaching();
        AssociatedObject.PreviewTextInput -= AssociatedObjectPreviewTextInput;
        AssociatedObject.PreviewKeyDown -= AssociatedObjectPreviewKeyDown;

        DataObject.RemovePastingHandler(AssociatedObject, Pasting);
    }

    private void Pasting(object sender, DataObjectPastingEventArgs e)
    {
        if (e.DataObject.GetDataPresent(typeof(string)))
        {
            var pastedText = (string)e.DataObject.GetData(typeof(string));

            if(!this.IsValidInput(this.GetText(pastedText)))
            {
                System.Media.SystemSounds.Beep.Play();
                e.CancelCommand();
            }
        }
        else
        {
            System.Media.SystemSounds.Beep.Play();
            e.CancelCommand();
        }
    }

    private void AssociatedObjectPreviewKeyDown(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.Space)
        {
            if (!this.IsValidInput(this.GetText(" ")))
            {
                System.Media.SystemSounds.Beep.Play();
                e.Handled = true;
            }
        }
    }

    private void AssociatedObjectPreviewTextInput(object sender, TextCompositionEventArgs e)
    {
        if (!this.IsValidInput(this.GetText(e.Text)))
        {
            System.Media.SystemSounds.Beep.Play();
            e.Handled = true;
        }
    }

    private string GetText(string input)
    {
        var txt = this.AssociatedObject;
        var realtext = txt.Text.Remove(txt.SelectionStart, txt.SelectionLength);
        var newtext = realtext.Insert(txt.CaretIndex, input);

        return newtext;
    }

    private bool IsValidInput(string input)
    {
        switch (InputMode)
        {
            case TextBoxInputMode.None:
                return true;
            case TextBoxInputMode.DigitInput:
                return input.CheckIsDigit();

            case TextBoxInputMode.DecimalInput:
                //minus einmal am anfang zulässig
                if (input == "-")
                    return true;
                decimal d;
                return decimal.TryParse(input, out d);
            default: throw new ArgumentException("Unknown TextBoxInputMode");

        }
        return true;
    }
}

public enum TextBoxInputMode
{
    None,
    DecimalInput,
    DigitInput
}

使用

   <TextBox>
        <i:Interaction.Behaviors>
            <MyBehaviors:TextBoxInputBehavior InputMode="DecimalInput"/>
        </i:Interaction.Behaviors>
    </TextBox>                
 类似资料:
  • 输入项目值时:1016M012G 10/1K16:1-C,但它仅显示1016M012G 10/1K16:1-C,G后不带加号 1016M012G/10/1K16:1-C工程罚款1016M012G-10/1K16:1-C工程罚款 有什么问题??

  • 问题内容: 我尝试使用大写过滤器,但它不起作用。我尝试过两种方法: 和 第二个触发JavaScript错误: 语法错误:令牌’test’是意外的,预期为[:] 我希望在用户在文本框中键入内容时将文本强制大写。 我怎样才能做到这一点? 问题答案: 请参阅下面的另一个答案,该答案优于此答案。 此答案基于以下答案:如何在AngularJS的输入字段中自动大写第一个字符?。 我以为您想要的是一个解析器函数

  • 我有一个带有文本框的WPF应用程序,我的用户将在其中输入以十进制为单位的纬度值(精度高达7位数)。当然,有效的纬度范围是-90.0000000到90.0000000。我试图创建一个regex,通过PreviewTextInput事件限制文本框的输入,类似于以下内容: 我当前的regex只允许输入数字,但还有一些其他限制,我也需要强制执行,比如: null null 我能仅仅通过修改我的regex来

  • Python3 实例 以下代码用于实现十进制转二进制、八进制、十六进制: # -*- coding: UTF-8 -*- # Filename : test.py # author by : www.runoob.com # 获取用户输入十进制数 dec = int(input("输入数字:")) print("十进制数为:", dec) print("转换为二进制为:", bin(dec

  • 我从数据库获取的值为10.00520.00,但当我绑定到输入时,它显示为10和520 实例 值绑定到文本框为10,但我希望绑定10.00

  • 问题内容: 我有一个Java文件 我想将 pic.bmp 转换为十六进制值的数组,以便可以编辑并将其保存为修改后的版本。 是否有Java类可以做到这一点? 问题答案: 你真幸运。我几个月前不得不这样做。这是一个精简版,需要从命令行获取两个参数。命令行参数都是文件名…第一个是输入文件,第二个是输出文件。输入文件以二进制形式读取,输出文件以ASCII十六进制形式写入。希望您可以根据自己的需要进行调整。