2

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

"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;

为什么前两个版本不起作用?最后一点代码不可能是正确的方法。

4

8 回答 8

6

尝试使用

double d = Convert.ToDouble(h2, CultureInfo.InvariantCulture);

代替

double d = Convert.ToDouble(h2);
于 2012-08-23T13:48:05.083 回答
3

许多人已经提到使用正则表达式。如果您对 Regex 不是很熟悉,那么此页面可能会对您有所帮助:

http://txt2re.com/index-csharp.php3?s=%22KL10124%20Traitor%20%232%20-%20%2bXX-%2b0.25%20-%20More%20Stuff%22&-7

干杯

于 2012-08-23T13:52:25.720 回答
3

尝试正则表达式方式:

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);
}
于 2012-08-23T14:25:51.830 回答
2
d = double.Parse(h2,CultureInfo.InvariantCulture);

您需要将转换操作的格式提供程序设置为不变。

于 2012-08-23T13:47:32.200 回答
1

您应该在转换之前查看 h2。看起来它不包括小数点。Convert.ToDouble 可能需要前导 0 才能知道它也是一个分数,我不确定。

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

于 2012-08-23T13:48:24.657 回答
1

使用这样的 RegEx 查询:

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

分组(括号中的表达式)将为您提供结果。

请参阅沙盒

于 2012-08-23T13:50:33.757 回答
0

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

同样使用正则表达式来提取数字会更直接。

于 2012-08-23T13:48:46.783 回答
0

使用正则表达式

(?<=\+)([0-9\.])+
于 2012-08-23T13:52:39.083 回答