从字符串中读取double值

我试图解决这个问题几个小时,绝对不明白编译器在这里做了什么。 我有基本上看起来像这样的字符串:

"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”。

但最后,如果我执行如下的powershell方法,我会在屏幕上得到逐字输出“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。 如果您对Regex不是很熟悉,那么这个页面可能对您有所帮助:

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知道它也是一个分数,我不确定。

一般来说,使用正则表达式会更容易。 看到这个答案 。

使用这样的RegEx查询:

 ^KL\d+ Traitor #\d \- \+XX\-\+(\d+\.\d+) \- .+ 

分组(括号中的表达式)将给出结果。

查看沙箱 。

在第一个代码示例中打印h2,以查看是否正确执行子字符串提取。

同样使用正则表达式来提取数字会更加直截了当。

使用正则表达式

 (?<=\+)([0-9\.])+