C#异常解析。双精度

C#异常解析。双精度,c#,math,C#,Math,我有一个简单的C#Web控制台应用程序,它利用HTML敏捷包从给定网站检索数据。我的代码从表单字段中获取一个值,并尝试将其重建为英寸,代码正常工作!然而,我想知道是否有更正确、更简单的方法来实现我的目标 string MetricName = "686 x 1981mm, 35mm Thick: £143.01"; var priceGrab = MetricName.Substring(MetricName.LastIndexOf('£') + 1); // 25.4 is what we

我有一个简单的C#Web控制台应用程序,它利用HTML敏捷包从给定网站检索数据。我的代码从表单字段中获取一个值,并尝试将其重建为英寸,代码正常工作!然而,我想知道是否有更正确、更简单的方法来实现我的目标

string MetricName = "686 x 1981mm, 35mm Thick: £143.01";

var priceGrab = MetricName.Substring(MetricName.LastIndexOf('£') + 1);
// 25.4 is what we divide the MM value by to get the inch value
const double imp = 25.4;

Match firstMeasurements = Regex.Match(MetricName, @"\d+");
Match secondMeasurements = Regex.Match(MetricName, @"x([^,]*)");
Match thicknessMeasurements = Regex.Match(MetricName, @",([^mm]*)");

string firstM = firstMeasurements.Value;

//Convert MM to Inches
double first = double.Parse(firstM) / imp;

string secondM = secondMeasurements.Value;
Match secondFixed = Regex.Match(secondM, @"\d+");
string secondM1 = secondFixed.Value;

//Convert MM to Inches
double second = double.Parse(secondM1) / imp;

string thicknessM = thicknessMeasurements.Groups[1].Value;
Match thirdFixed = Regex.Match(thicknessM, @"\d+");

//Convert MM to Inches
double three = double.Parse(thicknessM) / imp;

ImperialVariant = string.Format("{0} x {1}\", {2}\" Thick: £{3}",first.ToString("00"), second.ToString("00"), three.ToString("0.00"), priceGrab);

return ImperialVariant;
帝国变型将等于:

30 x 78英寸,1.38英寸厚:143.01英镑

由于未知原因,我的程序引发以下异常

在System.Number.ParseDouble(字符串值、NumberStyles选项、NumberFormatInfo numfmt) at System.Double.Parse(字符串s)

有人能提供一些反馈吗


谢谢

这有点让人困惑,因为尝试执行代码不会产生任何异常。但是,

我想知道是否有更正确、更简单的方法来实现我的目标

我建议简化正则表达式,对浮点数使用
Decimal
,使用格式说明符格式化输出,并确保在解析和格式化时使用正确的
CultureInfo

String ConvertToImperial(String text) {
  var regex = new Regex(@"^(?<first>\d+)\s*x\s*(?<second>\d+)mm,\s*(?<third>\d+)mm Thick: £(?<price>\d+\.\d+)$");
  var match = regex.Match(text);
  if (!match.Success)
    return null;
  var first = Int32.Parse(match.Groups["first"].Value);
  var second = Int32.Parse(match.Groups["second"].Value);
  var third = Int32.Parse(match.Groups["third"].Value);
  var price = Decimal.Parse(match.Groups["price"].Value, CultureInfo.InvariantCulture);
  return String.Format(
    CultureInfo.InvariantCulture,
    @"{0:F0} x {1:F0}"", {2:F2}"" Thick: £{3:N2}",
    ConvertToInches(first),
    ConvertToInches(second),
    ConvertToInches(third),
    price
  );
}

Decimal ConvertToInches(Decimal mm) {
  return mm/25.4M;
}
字符串转换为媒体(字符串文本){
var regex=新的正则表达式(@“^(?\d+)\s*x\s*(?\d+)毫米、\s*(?\d+)毫米厚:(?\d+\。\d+)$”;
var match=regex.match(文本);
如果(!match.Success)
返回null;
var first=Int32.Parse(match.Groups[“first”].Value);
var second=Int32.Parse(match.Groups[“second”].Value);
var third=Int32.Parse(match.Groups[“third”].Value);
var price=Decimal.Parse(match.Groups[“price”].Value,CultureInfo.InvariantCulture);
返回字符串格式(
CultureInfo.InvariantCulture,
@“{0:F0}x{1:F0}”,“{2:F2}”“厚:£{3:N2}”,
ConvertoInches(第一),
转换英寸(秒),
ConvertoInches(第三),
价格
);
}
十进制转换英寸(十进制毫米){
返回毫米/25.4米;
}

如果输入字符串中提供了一些非常大的数字,则此代码仍然会引发异常。

究竟是什么异常?哪一行代码会引发异常。你有3个地方可能有这种可能性。另外,对于这3个值中的每一个,您从正则表达式匹配中得到的值是什么?我不得不注意,
[^mm]
应该是
[^m]
@hvd它可能更清楚它应该做什么,但它做什么也有欺骗性,因为它实际上没有查找字符串
mm
,但是一个
m
。这简直让我烦透了。:)另外,一个单独的正则表达式,描述了整个相关部分,可能更容易阅读:
(?\d+)\sx\s(?\d+)mm\s(?\d+)mm\sThick
谢谢Martin和大家,代码工作得非常完美!我为没有提供进一步的信息而道歉,起初我有点“匆忙”。再次感谢,回复非常好。