簡體   English   中英

C#代碼將字符串轉換為Double

[英]C# code to convert string to Double

我試圖將某些特定類型的字符串轉換為c#中的double。 通常,Convert.ToDouble()可以很好地工作,但是這一步並不總是返回健康的字符串。 這意味着輸入並不總是以“ 4.2”的格式出現。 有時它也以4.4.2的形式出現。 現在,我也不能依靠定位和截斷,因為明天可能是10.11.445?

我可以在這種情況下應用任何簡單且簡短的字符串操作功能嗎?

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"); }

...這是我編寫過的最愚蠢的代碼。

我認為這將通過解析整個字符串(如果沒有小數點)或僅在字符串的前兩個部分(如果有多個小數)來根據您的注釋進行操作。

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

在發表評論之后,我假設您想使用字符串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);
}

我將創建一種方法來創建一堆用於解析輸入文本的策略,然后遍歷這些策略直到找到結果。

首先,我將定義一個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如果所有策略均null則返回null 最終策略t => null ,這是明確的,但對於獲得最終null結果卻不是必需的。

由於需要新的策略來解析不同類型的輸入文本,因此可以根據需要將它們添加到列表中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM