我试图解决这个几个小时,完全不明白编译器在这里做。 我有一个字符串,基本上是这样的:
"KL10124 Traitor #2 - +XX-+0.25 - More Stuff"
并需要读出双“0.25”编程。 调用以上人民政府字符串,下面两行不工作:
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);
许多人已经开始使用正则表达式已经提到。 如果你不是很熟悉正则表达式,那么这个页面可以帮助你:
http://txt2re.com/index-csharp.php3?s=%22KL10124%20Traitor%20%232%20-%20%2bXX-%2b0.25%20-%20More%20Stuff%22&-7
干杯
d = double.Parse(h2,CultureInfo.InvariantCulture);
你需要转换操作的格式提供设置不变。
尝试正则表达式的方法:
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);
}
你应该看看H2你转换之前。 它看起来像它不包括小数点。 Convert.ToDouble可能需要领先的0至知道这是一小部分也是,我不能肯定。
一般来说,这是更容易使用正则表达式很多。 见这个答案 。
使用正则表达式查询是这样的:
^KL\d+ Traitor #\d \- \+XX\-\+(\d+\.\d+) \- .+
一个分组(括号表达式)会给你的结果。
见沙箱 。
在第一个代码示例打印H2看到,如果你正确地做子提取。
还使用正则表达式来提取NUMER会更straigthforward。