Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从字符串中读取双精度值_C#_.net_Double - Fatal编程技术网

C# 从字符串中读取双精度值

C# 从字符串中读取双精度值,c#,.net,double,C#,.net,Double,我花了几个小时试图解决这个问题,但完全不明白编译器在这里做什么。我的字符串基本上如下所示: "KL10124 Traitor #2 - +XX-+0.25 - More Stuff" ^KL\d+ Traitor #\d \- \+XX\-\+(\d+\.\d+) \- .+ 并且需要以编程方式读取双精度“0.25”。调用s上方的字符串时,以下两行不起作用: string[] h = s.Split('-'); string h2 = h[2].Substring(1,h[2].Length

我花了几个小时试图解决这个问题,但完全不明白编译器在这里做什么。我的字符串基本上如下所示:

"KL10124 Traitor #2 - +XX-+0.25 - More Stuff"
^KL\d+ Traitor #\d \- \+XX\-\+(\d+\.\d+) \- .+
并且需要以编程方式读取双精度“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;
为什么前两个版本不起作用?代码的最后一位不能正确执行此操作

d = double.Parse(h2,CultureInfo.InvariantCulture);
您需要将转换操作的格式提供程序设置为不变量。

尝试使用

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

double d = Convert.ToDouble(h2);

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


一般来说,使用正则表达式要容易得多。请参阅。

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


另外,使用正则表达式来提取数字将更加严格。

使用如下正则表达式查询:

"KL10124 Traitor #2 - +XX-+0.25 - More Stuff"
^KL\d+ Traitor #\d \- \+XX\-\+(\d+\.\d+) \- .+
分组(括号中的表达式)将给出结果


参见。

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

干杯

使用正则表达式

(?<=\+)([0-9\.])+
(?试试正则表达式:

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
?您的第一个代码段返回“0.25”当我运行它时。我的区域性是en GB,代码的第一位给出了你的第一个示例0.25。如果你试图解析的字符串具有已知的结构,为什么不研究使用System.Text.RegEx类来提取数字。谢谢,这是可行的。但是你能告诉我为什么我的代码,即使在用“.”替换“.”之后,仍然不起作用吗默认情况下,Convert.ToDouble中的逗号用于分隔数字的千分之一。例如,“163555”被转换为163555。因此,使您的数字为“0,25”只是发出25号。是的,我已经检查了所有明显的问题,比如子字符串等。很多次了,我不想用太多的代码把Q弄得乱七八糟。Thx,这是可行的,但正如在Ivanovs的回答中一样,我不明白为什么我的代码在手动替换“.”by“,”之后不起作用。谢谢,确实从来没有听说过。我会详细查看链接。谢谢,但我没有帽子和子字符串可以包括0。我不想在原始Q中添加太多代码。我将检查正则表达式。谢谢,我将尝试正则表达式。但这不会像在您的代码中那样容易,因为我在Q中不清楚“叛徒”一词、字符串的长度以及“#2”的存在都是灵活的,但我需要读取的所有字符串都有相同的结构,即“-”字符,这就是为什么我选择在这个字符处拆分字符串。@ToaoG:当然,我理解,我的正则表达式版本比较严格,但您可以使用
+
来降低它的严格性,意思是“任意字符或更多”。谢谢,威尔·迪夫。试用正则表达式。