改进双转换方法

时间:2016-10-19 13:18:24

标签: c# double

我目前有以下两种方法:

public static Point[] PolygonFromFile(string file)
    {
        string[] GBfile = File.ReadAllLines(file);

        // remove unnecessary data from first 2 lines, never contains any polygon data
        GBfile[0] = string.Empty;
        GBfile[1] = string.Empty;

        const string delim = "   ";

        List<string> points = (from s in GBfile where !string.IsNullOrEmpty(s) from i in s.Split(delim.ToCharArray()) where !string.IsNullOrEmpty(i) && i != "END" select i).ToList();

        List<Point> polygon = new List<Point>();

        for (int i = 0; i < points.Count / 2; i++)
        {
            polygon.Add(new Point
            {
                X = PointParse(points[i]),
                Y = PointParse(points[i + 1])
            });
        }

        return polygon.ToArray();
    }

    private static double PointParse(string value)
    {
        string[] parsed = value.Split("E".ToCharArray());

        char function = '\0';
        bool met = false;

        foreach (char c in parsed[1])
        {
            if (c == '-' || c == '+')
            {
                function = c;
                break;
            }
        }

        var splitMultiplier = parsed[1].Split(function);
        double decimalPlaces = Convert.ToDouble(splitMultiplier[1]);

        if (decimalPlaces == 0) return Convert.ToDouble(parsed[0]);

        switch (function)
        {
            case '+':
                return Convert.ToDouble(parsed[0]) * Math.Pow(10, decimalPlaces);
            case '-':
                return Convert.ToDouble(parsed[0]) / Math.Pow(10, decimalPlaces);
        }

        return 0;
    }

这会将5.807600E-02之类的值转换为0.058076的真值。

我觉得这是一种非常冗长的方式来实现我所需要的,C#中是否有一个函数可以实现这一目标,还是需要通过上述过程将给定值转换为必要的值?

3 个答案:

答案 0 :(得分:2)

.NET可以自己解析这些值

Double.Parse("5.807600E-02");

将返回值0.058076作为double。

答案 1 :(得分:0)

这个怎么样?

double d = Double.Parse("1.2345E-03", System.Globalization.NumberStyles.Float);

答案 2 :(得分:0)

您可以使用解析功能。试试这个。

decimal d = Decimal.Parse("5.807600E-02",System.Globalization.NumberStyles.Float);