簡體   English   中英

如何將字符串轉換為double? 我要例外了

[英]How can i convert string to double ? I'm getting exception

for(int i = 0; i < Rect.rectangles.Count; i++)
        {
            if (Rect.rectangles[i].transform != null && Rect.rectangles[i].transform != "")
            {
                string firstNumber = Rect.rectangles[i].transform.Substring(18, 10);
                string secondNumber = Rect.rectangles[i].transform.Substring(7, 10);
                double a = Convert.ToDouble(firstNumber);
                double b = Convert.ToDouble(secondNumber);
            }
        }

第一個數字是0.49052715,a的Convert.ToDouble可以。 但是,當到達終點時:

double b = Convert.ToDouble(secondNumber);

我遇到異常:

FormatException:未知字符:,

但是secondNumber中的字符串完全沒有任何char / s:0.87142591

這是轉換中的整個字符串:matrix(0.87142591,0.49052715,-0.49052715,0.87142591,0,0)

我正在提取前兩個數字:0.49052715和0.87142591,然后嘗試將它們轉換為雙精度。 但是得到例外。

包含Rect.rectangles定義的代碼:

private void ParseSvgMap()
    {
        XDocument document = XDocument.Load(@"C:\Users\mysvg\Documents\my.svg");

        Rect.rectangles = document.Descendants().Where(x => x.Name.LocalName == "rect").Select(x => new Rect()
        {
            style = Rect.GetStyle((string)x.Attribute("style")),
            id = (string)x.Attribute("id"),
            width = (double)x.Attribute("width"),
            height = (double)x.Attribute("width"),
            x = (double?)x.Attribute("width"),
            y = (double?)x.Attribute("width"),
            transform = x.Attribute("transform") == null ? "" : (string)x.Attribute("transform")
        }).ToList();

        for(int i = 0; i < Rect.rectangles.Count; i++)
        {
            if (Rect.rectangles[i].transform != null && Rect.rectangles[i].transform != "")
            {
                string firstNumber = Rect.rectangles[i].transform.Substring(18, 10);
                string secondNumber = Rect.rectangles[i].transform.Substring(7, 10);
                double a = Convert.ToDouble(firstNumber);
                double b = Convert.ToDouble(secondNumber);
                float degree = FindDegree(a, b);
            }
        }
    }

    public static float FindDegree(double a, double b)
    {
        float value = (float)((System.Math.Atan2(a, b) / System.Math.PI) * 180f);
        if (value < 0) value += 360f;

        return value;
    }

    public class Rect
    {
        public static List<Rect> rectangles { get; set; }
        public Dictionary<string, string> style { get; set; }
        public string id { get; set; }
        public double width { get; set; }
        public double height { get; set; }
        public double? x { get; set; }
        public double? y { get; set; }
        public string transform { get; set; }
        public double degree { get; set; }

        public static Dictionary<string, string> GetStyle(string styles)
        {
            string pattern = @"(?'name'[^:]+):(?'value'.*)";
            string[] splitArray = styles.Split(new char[] { ';' });
            Dictionary<string, string> style = splitArray.Select(x => Regex.Match(x, pattern))
                .GroupBy(x => x.Groups["name"].Value, y => y.Groups["value"].Value)
                .ToDictionary(x => x.Key, y => y.FirstOrDefault());
            return style;
        }
    }

諸如.Substring(18, 10)類的代碼非常脆弱,並且(如您所發現)是等待發生的事故。 不能保證數字的長度相同。 只需查看您提供的樣本數據即可。

在嘗試解析字符串之前,應該使用正則表達式之類的東西從字符串中提取數字。

var regex  = new Regex(@"matrix\((?<num>-?(?:\d|\.)+)(?:,(?<num>-?(?:\d|\.)+))*\)");
var data   = "matrix(0.87142591,0.49052715,-0.49052715,0.87142591,0,0)";
var values = regex
              .Matches(data)
              .Cast<Match>()
              .SelectMany(m => m.Groups["num"]
                                .Captures
                                .Cast<Capture>()
                                .Select(c=>c.Value))
              .Select(double.Parse)
              .ToList();

然后使用values[0]values[1]選取所需的數字。

它注定要失敗。 我將使用以下正則表達式:

        string test = "matrix(0.1234,0.23233433,0.34,-3343,-3.33)";
        Regex reg = new Regex("[-]?[0-9]+(\\.[0-9]+)?");
        MatchCollection coll = reg.Matches(test);

您可以按照以下方式編寫方法:

 public double fixString(string incoming)
 {
  Double a;
  if(incoming.Contains(','))
  {
   string fixedNum = incoming.Remove(incoming.IndexOf(','));
   a = Convert.ToDouble(fixedNum);
   return a;
  }
  else
  {
   a = Convert.ToDouble(incoming);
   return a;
  }
 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM