Textbox Number Formating&从零开始仅接受数字

时间:2017-03-01 08:37:44

标签: c# winforms textbox maskedtextbox

我使用下面的Property示例对textbox进行一些计算,如果textbox为null,我给它分配零,这样计算就不会失败,因为你可以看到我正在使用Math.Round和我想要对这些textbox输入进行多次检查,例如

  1. 仅接受我搜索过的数字的文本框,找到方法1

  2. 我希望我的文本框格式化我搜索并找到方法2

  3. 现在我的问题是......

    有没有办法在我使用的属性方法中mareg所有这些方法 所以我的代码不会像“意大利面条代码”?

    有没有更好的方法来进行这些检查?

    提前谢谢

    属性示例

        public double ItemPriceResult
        {
            get
            {
                return Math.Round(ItemCost * RevenuePercentage / 100 + ItemCost, 0);
            }
        }
    

    方法1

    private void textBox1_TextChanged(object sender, EventArgs e)
    {
        if (System.Text.RegularExpressions.Regex.IsMatch(textBox1.Text, "[^0-9]"))
        {
            MessageBox.Show("Please enter only numbers.");
            textBox1.Text = textBox1.Text.Remove(textBox1.Text.Length - 1);
        }
    }
    

    方法2

    textBox1.Text = string.Format(System.Globalization.CultureInfo.GetCultureInfo("id-ID"), "{0:#,##0.00}", double.Parse(textBox1.Text));
    

    在一些答案后更新

    MaskedTextBox似乎符合我的需要,我会阅读和搜索,并在一些问题下面 如果你愿意帮助我

    我需要使用MaskedTextBox,因为我可以将其设置为接受 号码和我也可以强制数字格式化

    我还需要让数字文本框更易于为用户阅读

    所以1000将会来1000 10000将来10000。

    然后根据Microsoft Docs格式MaskedTextBox来满足我的需求 屏蔽MaskedTextBox 999,999,999
    but my problem is formating not correct as you can see at image below

    第二我不希望PromptChar显示我谷歌它但没有搜索结果这样做

3 个答案:

答案 0 :(得分:1)

试试这个,它只接受数字,你可以使用正则表达式格式化字符串。

 public static string ToMaskedString(this String value)
  {
    var pattern = "^(/d{2})(/d{3})(/d*)$";
    var regExp = new Regex(pattern);
    return regExp.Replace(value, "$1-$2-$3");
  }

答案 1 :(得分:1)

你有TextBox。唉,你不知道你使用什么样的TextBox。 System.Windows.Forms.TextBox? System.Web.UI.MobileControls.TextBox?

你写“如果文本框为空我给它指定零”。我假设你的意思是如果在文本框中没有输入任何文本,你会认为输入了0。

此外,您希望在文本更改时格式化文本框的输出。因此,当操作员输入文本时,您想要更改此文本?对于操作员来说这非常烦人。

您不希望操作员有义务以您想要的格式输入他的文本,从视觉上帮助他。为此,您可以使用课程MaskedTextBox

MaskedTextBox有一个属性Mask,强制操作员输入某种格式。我对你使用格式 {0:#,## 0.00} 所做的事情并不熟悉,但我假设你希望输出加倍为实数格式,小数点后用两位数当前文化中常见的小数点和千位分隔符。

通过设计者输入初始化组件:

this.maskedTextBox1.Mask = "99990.00";
添加文本更改后的

private void maskedtextBox1_TextChanged(object sender, EventArgs e)
{
   double enteredValue = 0.0; // value to use when empty text box
   if (!String.IsNullOrEmpty(this.maskedtextBox1.Text))
   {
      enteredValue = double.Parse(maskedTextBox1.Text, myFormatProvider)
   }
   ProcessEnteredValue(enteredValue);
}

}

答案 2 :(得分:0)

编辑后,规格已更改。

  • 在文本框中输入数字时,操作员不应该对其编号的格式有任何视觉反馈。
  • 操作员可以任意常用格式输入实数。
  • 操作员编辑文本框时,不应使用文本框的值。
  • 仅在编辑完成后,应解释文本框的值是否正确,如果正确则应使用。
  • 实际使用的值应以定义的格式显示在文本框中。

在进入时不想显示任何视觉反馈的愿望是可以理解的。毕竟,该计划并不关心运营商是否输入10001000.00,甚至是1.0E3

MaskedTextBox特别用于强制操作员以给定格式输入他的号码。由于这不是必需的,我的建议是使用TextBox代替MaskedTextBox

但是,因为您可以让操作员以他想要的任何方式自由输入他的号码,包括复制粘贴,修复打字错误等等,您必须添加用户表达的可能性。他已完成输入号码的程序。

Windows UI中经常使用的方法是Button。另一种可能性是enter button。请注意,这在Windows中并不是真正的标准。这可能会让学习你的课程变得更加困难。

因此,在操作员通知他完成编辑并调用相应的事件函数后,您的代码可能是:

// Get the numberformat to use, use current culture, or your own format
private readonly IFormatProvider myNumberFormat = CultureInfo.CurrentCulture.NumberFormat

private void OperatorFinishedEditing(TextBox box)
{
    // read the text and try to parse it to a double
    // accepting all common formats of real numbers in the current culture
    bool valueOk = true;
    double resultValue = 0;
    if (!String.IsNullOrEmpty(box.Text))
    {
       bool valueOk = Double.TryParse(box.Text, out resultValue);
    }

    if (valueOk)
    {
        box.Text = FormatResultValue(resultValue);
        ProcessValue(resultValue);
    }
    else
    {
        ShowInputProblem();
    }
}