我已经尝试解决这个问题好几个小时了,但完全不明白编译器在这里做什么。我有基本上看起来像这样的字符串:
"KL10124 Traitor #2 - +XX-+0.25 - More Stuff"
并且需要以编程方式读取双"0.25"。调用s上面的字符串,以下两行不起作用:
string[] h = s.Split('-');
string h2 = h[2].Substring(1,h[2].Length - 2);
double d = Convert.ToDouble(h2);
如果我显示d,则输出为"25"。我想这可能取决于"。"resp','区域性依赖,但如果我插入
double d = Convert.ToDouble(h2.Replace('.',','));
它没有改变任何东西,输出仍然是"25"。
但最后,如果我按照下面的方法使用暴力,我会在屏幕上得到逐字逐句的输出"0,25"
double d;
string[] h = s.Split('-');
string h2 = h[2].Substring(1,h[2].Length - 2);
if (h2.Contains("."))
{
string[] h3 = h2.Split('.');
d = Convert.ToDouble(h3[0]) + Convert.ToDouble(h3[1])/100;
}
else
{
d = Convert.ToDouble(h2);
}
return d;
为什么前两个版本不起作用?最后一段代码不可能是正确的方法。
尝试使用
double d = Convert.ToDouble(h2, CultureInfo.InvariantCulture);
而不是
double d = Convert.ToDouble(h2);
尝试Regex方式:
string input = "KL10124 Traitor #2 - +XX-+0.25 - More Stuff";
Match match = Regex.Match(input, "^.*([0-9]+\.[0-9]+).*$");
if (match.Success)
{
double value = Convert.ToDouble(match.Groups[1].Value, CultureInfo.InvariantCulture);
Console.Write(value);
}
许多人已经提到使用Regex。如果你不是很熟悉Regex,那么这个页面可能会帮助你:
http://txt2re.com/index-csharp.php3?s=%22KL10124%20Traitor%20%232%20-%20%2bXX-%2b0.25%20-%20更多%20填充%22&-7
干杯
d = double.Parse(h2,CultureInfo.InvariantCulture);
您需要将转换操作的格式提供程序设置为不变量。
您应该在转换之前查看h2。它看起来不包括小数点。Convert.ToDouble可能需要前导0来知道它也是一个分数,我也不确定。
一般来说,使用正则表达式会容易得多。看看这个答案。
使用这样的RegEx查询:
^KLd+ Traitor #d - +XX-+(d+.d+) - .+
分组(括号中的表达式)将给出结果。
查看沙盒。
在第一个代码示例中打印h2,查看子字符串提取是否正确。
此外,使用正则表达式来提取数字会更加直接。
使用Regex
(?<=+)([0-9.])+