【问题标题】:Check for negative value with TryParse C#使用 TryParse C# 检查负值
【发布时间】:2018-10-10 13:35:07
【问题描述】:

我知道关于这个主题有几个主题,但我没有找到适合我的答案。所以我用double.TryParse检查了正确的值,但我还必须检查它们是否为负:

static void Main(string[] args)
{
    double radius, hoehe, umfang, volumen, oberfl;

    Console.WriteLine("Radius des Zylinders eingeben: ");

    while (!double.TryParse(Console.ReadLine(), out radius))
    {
        Console.WriteLine("Wert ist ungültig! Bitte erneut versuchen.");
    }

    Console.WriteLine("Hoehe des Zylinders eingeben: ");

    while (!double.TryParse(Console.ReadLine(), out hoehe))
    {
        Console.WriteLine("Wert ist ungültig! Bitte erneut versuchen.");
    }

    umfang = 2 * Math.PI * radius;
    volumen = Math.PI * Math.Pow(radius, 2) * hoehe;
    oberfl = umfang * (radius + hoehe);

    Console.WriteLine("Umfang: {0:f2}", umfang);
    Console.WriteLine("Volumen: {0:f2}", volumen);
    Console.WriteLine("Oberfläche: {0:f2}", oberfl);

    Console.ReadKey();
}

首先我想把它添加到while语句中,比如

while (!double.TryParse(Console.ReadLine(), out radius) && radius <=0)

但这不起作用。那么你能告诉我另一种可能性吗,也许是另一种 if 语句?

【问题讨论】:

  • 你说的这是什么意思
  • 你收到错误了吗?
  • 只需将 while 语句中的条件更改为 || 而不是 &amp;&amp;

标签: c# tryparse


【解决方案1】:

&amp;&amp; 更改为||。由于|| 在第一个表达式被评估为真之后停止:

  • 如果输入不是双精度,那么它将再次迭代(并且不会像 &amp;&amp; 那样检查第二个条件 - 这是问题所在)
  • 如果输入是双精度但为 &lt;= 0,它将再次迭代。

因此,如果输入为正双精度,它将停止迭代。

while (!double.TryParse(Console.ReadLine(), out radius) || radius <=0)

另外,由于您使用此代码两次(至少)可能将其封装在一个函数中?

public double GetPositiveDouble()
{
    double result;
    while (!double.TryParse(Console.ReadLine(), out result))
    {
        Console.WriteLine("Wert ist ungültig! Bitte erneut versuchen.");
    }
    return result;
}

【讨论】:

    【解决方案2】:

    您可以使用接受NumberStyles 标志的double.TryParse 重载。如果您期望一个没有符号的浮点数(例如只有非负数),您可以指定:

    double.TryParse(
        Console.ReadLine(),
        NumberStyles.AllowDecimalPoint,
        CultureInfo.CurrentCulture,
        out var radius)
    

    如果数字有符号(-+)并且您知道指定的数字始终为非负数,这将返回 false。

    请注意,如果数字 0.0 不是您想要的,则返回 true。

    如果您还想允许空格和指数符号等,您必须提供额外的NumberStyles 标志。

    【讨论】:

      【解决方案3】:

      你的条件是错误的。它应该是:

      while (!(double.TryParse(Console.ReadLine(), out radius) && radius > 0))
      

      【讨论】:

        【解决方案4】:

        您的代码可以工作...它应该是 OR,而不是 AND:

        while (!double.TryParse(Console.ReadLine(), out radius) || radius <=0)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-08-17
          • 1970-01-01
          相关资源
          最近更新 更多