【问题标题】:How to tell if user enter an integer or Double or Decimal如何判断用户是否输入整数、双精度或小数
【发布时间】:2014-09-23 06:43:41
【问题描述】:

我需要找出用户在文本框中输入的值。

用户可以在文本框中输入整数、双精度或十进制数字。

我应该使用哪个来验证值?

Double.Parse(txtboxNo.text) 
int.Parse(txtboxNo.text);
Decimal.Parse(txtboxNo.text)

我试过了(如果用户输入 1 或 1.8,这个功能仍然有效):

public bool IsNumeric(string strNbr)
{
    Double d_Nbr;

    try
    {
        d_Nbr = Double.Parse(strNbr);
        return true;
    }
    catch (Exception ex)
    {
        return false;
    }
}

我的问题: 我正在开发一个移动销售应用程序。销售人员有权更改价格。推销员想快速工作。所以,我需要检测他是否输入了正确的价格(我的价格是十进制的)如果他输入了怎么办:例如:1 或 1.0 或 23 或 333.0 或按有趣的 123456 。我如何处理?

【问题讨论】:

  • 你在用这个值做什么?询问是因为这似乎不是您将面临的实际问题。还有,Double 和 Decimal 的字符串表示有什么区别?
  • 检查框架的“is”关键字。
  • 如果他们可以输入小数,那么int.parse 会出错,我个人会使用正确的TryParse
  • @Nenotlep "2e4" 是 Double.Parse 的有效输入,但不适用于 Decimal.Parse
  • 您应该向我们解释您对在文本框中输入“1”的用户的决定/偏好。这种困境没有任何意义。您应该担心该输入的预期用途并采取相应措施。

标签: c#


【解决方案1】:

我不确定目的,但您可以尝试 Double/Int/Decimal 的 TryParse() 方法来验证字符串值。

if (Double.TryParse(value, out number))
   Console.WriteLine(number);
else
   Console.WriteLine("{0} is outside the range of a Double.",

MSDN 文章: http://msdn.microsoft.com/en-us/library/994c0zb1%28v=vs.110%29.aspx

【讨论】:

    【解决方案2】:

    区分 int 和 double/decimal 并不是什么大问题,您只需要测试它是否有小数点。只有当您尝试区分双精度和小数时,问题才会开始,因为两者都有小数点,唯一的区别是精度,如下所示: Difference between decimal, float and double in .NET?

    我可以看到的一种可能性是您尝试查找小数点,然后查看它是否有足够的数字可以看到小数而不是浮点数。 String textBoxValue = txtboxNo.Text.Replace(',', '.');

    if (textBoxValue.IndexOf(".") >= 0) 
    {
        // double or decimal
        if (textBoxValue.length >= 17)
        {
            // Possible decimal as too long for double
            Decimal mydec;
            if (Decimal.TryParse(textBoxValue , out mydec))
            {
               // Is decimal
            }
           else
           {
               // Is something else
           }
        } 
        else
        {
           double mydoub;
           if (Double.TryParse(textBoxValue, out mydoub))
           {
               // Is double
           }
           else
           {
               // Is something else
           }
        }
    }
    else
    {
        int myInt;
        // possible int 
        if (int.TryParse(textBoxValue, out myInt))
        { 
            // its an int
        }
        else
        {
            // something else
        }
    }
    

    【讨论】:

    • @Steve - 好点,但 IndexOf 小数点会阻止这种情况发生在这里
    • 啊,暂时忽略了 steve 的意思。是的,这就是为什么我把 indexof 放在第一位,然后才区分 double 和 decimal 以避免这个问题
    • '.'取决于所选的文化。
    • @Corak steve 有一个观点,因为“1”会为 double 返回 true,尽管它是一个整数。我首先用 indexof 检查了它,并确保只有在它不能是整数时才检查双精度/小数(通常我会尝试 int.tryparse 而不是 indexof,但我已经看到过去告诉我双精度是失败的)一个整数,所以我使用 indexof 首先确保它是我正在查看的小数点值])
    • 我的观点是:表示数字且不包含小数点的字符串仍然是可能的双精度数。因此,如果不知道输入的原因,这个问题就毫无意义。但是,如果您知道输入的原因,您可以使用适当的类型来达到您的目的。你的回答是正确的,但你必须假设如果没有小数点那么它是一个整数。
    【解决方案3】:

    你可以使用*

    double output;
    if(double.tryParse(txtboxNo.Text,output))
    {
     // it's double
    }
    else{// not double }
    

    【讨论】:

    • 我认为,当您向您的意图添加一些解释时,这对操作员和其他访问者会更有帮助(例如:解释,tryParse() 方法的工作原理)。
    • 我也不明白你们为什么总是给-1 -1评分!
    猜你喜欢
    • 2014-09-27
    • 1970-01-01
    • 2011-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-30
    • 2019-04-11
    相关资源
    最近更新 更多