我试图将一些特定类型的字符串转换为c#中的double。通常,Convert.ToDouble()工作得很好但是这个并不总是返回健康的字符串。这意味着输入并不总是以“4.2”的格式出现。它有时也以4.4.2的形式出现。现在,我也不能依赖定位和截断,因为明天可能是10.11.445?
我可以在这种情况下应用任何简单的短字符串操作函数吗?
答案 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
是明确的,但在获得最终的空结果时不是必需的。
由于需要新的策略来解析不同类型的输入文本,因此可以根据需要将它们添加到列表中。