我试图解决这个问题几个小时,绝对不明白编译器在这里做了什么。我的字符串基本上是这样的:
"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;
为什么前两个版本不起作用?最后一点代码不是正确的方法。
答案 0 :(得分:6)
尝试使用
double d = Convert.ToDouble(h2, CultureInfo.InvariantCulture);
而不是
double d = Convert.ToDouble(h2);
答案 1 :(得分:3)
许多人已经提到使用Regex。如果您对Regex不是很熟悉,那么这个页面可能会对您有所帮助:
干杯
答案 2 :(得分:2)
d = double.Parse(h2,CultureInfo.InvariantCulture);
您需要将转换操作的格式提供程序设置为不变。
答案 3 :(得分:2)
尝试使用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);
}
答案 4 :(得分:1)
转换前你应该看看h2。看起来它不包括小数点。 Convert.ToDouble可能要求前导0知道它也是一个分数,我不确定。
一般来说,使用正则表达式会更容易。请参阅this answer。
答案 5 :(得分:1)
答案 6 :(得分:0)
在第一个代码示例中打印h2,看看你是否正确地进行子串提取。
同样使用正则表达式来提取数字会更加直截了当。
答案 7 :(得分:0)
使用正则表达式
(?<=\+)([0-9\.])+