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

从较长的C#字符串中读取双精度值,c#,C#,我有一个字符串,它的形状像“-23.45m/abc=53.02m/s”,我想把它拆开。您可能认为在.net中有一种简单的方法可以获取-23.45(就像使用内置的浮点解释器),并告诉我字符串的其余部分从“m”开始 在C++中,我将使用< /P> double num; wchar_t* input_text = L"-23.45m / abc = 53.02m/s"; if (swscanf(input_text, L"%lf%n", &num, &count) == EOF)

我有一个字符串,它的形状像“-23.45m/abc=53.02m/s”,我想把它拆开。您可能认为在.net中有一种简单的方法可以获取-23.45(就像使用内置的浮点解释器),并告诉我字符串的其余部分从“m”开始

在C++中,我将使用< /P>
double num;
wchar_t* input_text = L"-23.45m / abc = 53.02m/s";
if (swscanf(input_text, L"%lf%n", &num, &count) == EOF)
  return false;
pos += count;

可以使用正则表达式在开始时匹配双精度值。你需要考虑你想支持什么。例如,是否要支持所有这些功能:

  • .5(小数点分隔符前无数字)
  • +.5(明确+)
  • 15(无十进制分隔符)
  • 1e-5(科学记数法)
  • 1000(千分位)
你也应该考虑你想分析什么样的文化——“1000”可以表示“一千”或“一点零零零点”取决于你的文化。< /P>
一旦确定了规范,编写正则表达式应该不会太难。这将允许您在一个捕获中匹配双精度值,在另一个捕获中匹配字符串的其余部分。

您可以在开始时使用正则表达式匹配双精度值。你需要考虑你想支持什么。例如,是否要支持所有这些功能:

  • .5(小数点分隔符前无数字)
  • +.5(明确+)
  • 15(无十进制分隔符)
  • 1e-5(科学记数法)
  • 1000(千分位)
你也应该考虑你想分析什么样的文化——“1000”可以表示“一千”或“一点零零零点”取决于你的文化。< /P>

一旦确定了规范,编写正则表达式应该不会太难。这将允许您在一个捕获中匹配双精度值,在另一个捕获中匹配字符串的其余部分。

字符串是否始终采用相同的格式?您可以使用正则表达式或字符串函数将数字提取到自己的字符串中。字符串始终以数字开头?哪些数字格式是有效的,数字使用哪种文化?你可以使用一个正则表达式,从字符串匹配的开头提取一个浮点号,对于<代码>浮点,然后保存其余的字符串,你说在C++中你会使用<代码> SCANF(“%LF”,和VAL);代码> C++中使用什么逻辑来查找<代码> Val< /Calp>?C接受很多,甚至有奇怪的格式,括号代表负数。默认情况下,它使用的是当前区域性,这可能不是您想要的。所以你应该对你想要的东西有一个清晰的说明。如果您决定jon提到的所有格式,我们/您可以创建一个正则表达式来提取字符串的数字部分。字符串是否始终采用相同的格式?您可以使用正则表达式或字符串函数将数字提取到自己的字符串中。字符串始终以数字开头?哪些数字格式是有效的,数字使用哪种文化?你可以使用一个正则表达式,从字符串匹配的开头提取一个浮点号,对于<代码>浮点,然后保存其余的字符串,你说在C++中你会使用<代码> SCANF(“%LF”,和VAL);代码> C++中使用什么逻辑来查找<代码> Val< /Calp>?C接受很多,甚至有奇怪的格式,括号代表负数。默认情况下,它使用的是当前区域性,这可能不是您想要的。所以你应该对你想要的东西有一个清晰的说明。如果您决定jon提到的所有格式,我们/您可以创建一个正则表达式来提取字符串的数字部分。老实说,我不在乎:,只要它已定义并且可以处理整数。如果我必须使用正则表达式,那么我可以试着做一些有效的东西:-?[0-9]+(\[0-9]+)+然后我们必须想办法找到一个吃这些东西的正则表达式,给我一个数字,并告诉我在哪里继续标记。@AlanBaljeu:regex不会给你一个数字-regex会给你数字部分,让你用
double.parse
double.TryParse
,以及字符串的其余部分来解析。这类问题是什么:如果有一种简单的方法来解析一个数字,为什么我不能简单地用它来提取数字?@AlanBaljeu:因为解析方法(在我看来,这是合理的)假设字符串末尾的无关数据表示错误。我个人认为是C标准库在这里做了错误的事情,而不是.NET。在我看来,想要在输入“456xyz”时失败比想要成功要常见得多。好吧,但这会让事情变得更加困难。如果我得到456.0和“xyz”,一个简单的If语句将允许我在需要时报告错误。现在,我必须构建一个复杂的正则表达式。谢谢你的指导,JonI真的不在乎:,只要它被定义并能处理整数。如果我必须使用正则表达式,那么我可以试着做一些有效的东西:-?[0-9]+(\[0-9]+)+然后我们必须想办法找到一个吃这些东西的正则表达式,给我一个数字,并告诉我在哪里继续标记。@AlanBaljeu:regex不会给你一个数字-regex会给你数字部分,让你用
double.parse
double.TryParse
,以及字符串的其余部分来解析。这类问题是什么:如果有一种简单的方法来解析一个数字,为什么我不能简单地用它来提取数字?@AlanBaljeu:因为解析方法(在我看来,这是合理的)假设字符串末尾的无关数据表示错误。我个人认为是C标准库在这里做了错误的事情,而不是.NET。在我看来,想要在输入“456xyz”时失败比想要成功要常见得多。好吧,但这会让事情变得更加困难。如果我得到456.0和“xyz”,一个简单的If语句将允许我在需要时报告错误。现在,我必须构建一个复杂的正则表达式。谢谢你的指导,乔恩