C#代码将字符串转换为Double

时间:2014-01-22 02:05:02

标签: c# .net string

我试图将一些特定类型的字符串转换为c#中的double。通常,Convert.ToDouble()工作得很好但是这个并不总是返回健康的字符串。这意味着输入并不总是以“4.2”的格式出现。它有时也以4.4.2的形式出现。现在,我也不能依赖定位和截断,因为明天可能是10.11.445?

我可以在这种情况下应用任何简单的短字符串操作函数吗?

4 个答案:

答案 0 :(得分:3)

struct CalifornicatedNumber
{
    private string value;
    public CalifornicatedNumber(string value) 
    { 
       this.value = value; 
    }
    static public implicit operator CalifornicatedNumber(string value) 
    {
       return new CalifornicatedNumber(value);
    }
    static public implicit operator CalifornicatedNumber(double value)
    {
        return new CalifornicatedNumber(value.ToString());
    }
    static public implicit operator double(CalifornicatedNumber calif)
    {                
        return double.Parse(MakeItMakeSense(calif.value));
    }

    static private string MakeItMakeSense(string calif)
    {
        if (calif.Count(x => x == '.') > 1)
          calif = calif.Substring(0, calif.IndexOf('.', calif.IndexOf('.') + 1));
          return calif;
    }            
}

...然后

CalifornicatedNumber califnum;
califnum = "10.11.145";
Console.WriteLine(califnum);
if (califnum > 10) { Console.WriteLine("huzzah");}
califnum = 13.42;
Console.WriteLine(califnum);
if (califnum > 10) { Console.WriteLine("huzzahZah"); }

......这是我写过的最愚蠢的代码。

答案 1 :(得分:1)

我认为,如果有多个小数,通过解析整个字符串(如果没有小数点)或仅仅是sting的前两部分,你会根据你的意见做你想做的事。

String[] parts = stringVal.Split('.');
double doubleVal;
if (parts.length > 1)
{    
    doubleVal = Convert.ToDouble(parts[0] + "." + parts[1]);
}
else
{
    doubleVale = Convert.ToDouble(stingVal);
}

答案 2 :(得分:1)

在发布的评论之后,我假设你想取字符串4.4.2并将其转换为在第二个.(如果找到)之后双重丢弃所有内容。

一种方法,如。

public static double ConvertStringToDouble(string inputString)
{
    if (inputString.Count(x => x == '.') > 1)
        inputString = inputString.Substring(0, inputString.IndexOf('.', inputString.IndexOf('.') + 1));
    return double.Parse(inputString);
}

答案 3 :(得分:1)

我会尝试创建一堆策略来解析输入文本,然后迭代策略直到找到结果。

首先我定义一个tryParseDouble函数:

Func<string, double?> tryParseDouble = t =>
{
    double value;
    if (double.TryParse(t, out value))
    {
        return value;
    }
    return null;
};

然后我会创建我的策略列表:

var strategies = new Func<string, double?>[]
{
    t =>
    {
        var parts = t.Split('.');
        return parts.Length > 1
            ? tryParseDouble(String.Join(".", parts.Take(2)))
            : null;
    },
    tryParseDouble,
    t => null,
};

最后我得到了结果:

var text = "4.4.2";

var result =
    strategies
        .Select(p => p(text))
        .Where(v => v != null)
        .FirstOrDefault();

result变量是double?,其值已解析,如果没有任何策略有效,则为null。最终策略t => null是明确的,但在获得最终的空结果时不是必需的。

由于需要新的策略来解析不同类型的输入文本,因此可以根据需要将它们添加到列表中。