【问题标题】:How to return a double or string for a method如何为方法返回双精度或字符串
【发布时间】:2011-07-21 12:57:07
【问题描述】:

我有一个方法:

public static double c(string val)
{
    return Math.Round(Convert.ToDouble(val), 4);
}

我传入一个字符串,如果它是双精度数,我想四舍五入然后返回一个双精度数,但如果它是一个字符串,我想按原样返回一个字符串。我传入的所有参数都将以字符串开头,我如何确定它是字符串还是双精度,以及如何重写方法以使返回类型足够灵活以返回其中一个?

理想情况下,我想在 vba 中使用类型变体,但我认为 c# 中没有类似物。

【问题讨论】:

  • 为什么要这样做?它将如何使用?您的调用者将期望一个返回类型 - 双精度或字符串,而不是两者。
  • @greg 如果您认为这个问题已经得到解答,您应该接受一个答案。

标签: c# generics


【解决方案1】:

下面将尝试解析double。如果返回true,它将把双精度值放入输出变量output; else return false 表示 val 不是双精度数,您应该改用 string val

public static bool c(string val, out double output)
{
    if (double.TryParse(val, out output))
    {
        output = Math.Round(output, 4);
        return true;
    }
    else
    {
        output = 0;
        return false;
    }
}

这样使用:

string val = "123.45678";
double output;
if ( c(val, out output) )
{
    // use double output
}
else
{
    // val isn't a double, just use val directly
}

【讨论】:

  • @greg,如果您认为我的回答是您问题的最佳解决方案,请点击此帖子旁边的勾号,将其作为解决方案。
【解决方案2】:

您可以使用typeof() 并将您的函数参数设置为object。然后您可以将所有内容传递给该函数,并可以使用typeof() 检查类型。

【讨论】:

  • 或许你也可以想到generics...
  • 使用泛型,调用者需要知道将返回什么类型。反之亦然,该方法在检查字符串是否为数字后知道它将返回什么类型。调用者只有在它回来时才知道。
  • @Tim Schmelter,你说得对,但我想提到他的泛型。这就是我将其添加为评论的原因;)
【解决方案3】:

不知道你为什么要做这样的事情,但是使用动态类型怎么样......

    public dynamic func(string s)
    {
        double d = 0;
        if (double.TryParse(s, out d))
            return Math.Round(d, 4);
        return s;
    }

【讨论】:

    【解决方案4】:

    在 .Net 4 中你可以使用

    public static string c(string val)
        {
            Double result;
            if (Double.TryParse(val, out result))
                return Math.Round(result, 4).ToString();
            else
                return val;
        }
    

    如果你没有使用 .Net 4

    public static string c(string val)
        {
            try
            {
                Double result = Convert.ToDouble(val);
                return Math.Round(result, 4).ToString();
            }
            catch
            {
                return val;
            }
        }
    

    【讨论】:

    • .net 4 对您的第一种方法有何特别之处? TrParse 是在框架 2.0 中添加的。在您的第二个块中,您应该捕获 FormatException 和 OverflowException,而不是基本异常。
    • Double.TryParse 不限于 .net 4.0...msdn.microsoft.com/en-us/library/3s27fasw(v=VS.80).aspx
    • 谢谢,我还以为是4.0才添加TryParse。
    猜你喜欢
    • 2010-09-24
    • 2014-06-11
    • 2012-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    相关资源
    最近更新 更多