How do I parse a string with a decimal point to a double?

前端 未结 19 1549
孤街浪徒
孤街浪徒 2020-11-22 06:47

I want to parse a string like \"3.5\" to a double. However,

double.Parse(\"3.5\") 

yields 35 and

double.Pars         


        
19条回答
  •  日久生厌
    2020-11-22 07:09

    I think 100% correct conversion isn't possible, if the value comes from a user input. e.g. if the value is 123.456, it can be a grouping or it can be a decimal point. If you really need 100% you have to describe your format and throw an exception if it is not correct.

    But I improved the code of JanW, so we get a little bit more ahead to the 100%. The idea behind is, that if the last separator is a groupSeperator, this would be more an integer type, than a double.

    The added code is in the first if of GetDouble.

    void Main()
    {
        List inputs = new List() {
            "1.234.567,89",
            "1 234 567,89",
            "1 234 567.89",
            "1,234,567.89",
            "1234567,89",
            "1234567.89",
            "123456789",
            "123.456.789",
            "123,456,789,"
        };
    
        foreach(string input in inputs) {
            Console.WriteLine(GetDouble(input,0d));
        }
    
    }
    
    public static double GetDouble(string value, double defaultValue) {
        double result;
        string output;
    
        // Check if last seperator==groupSeperator
        string groupSep = System.Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberGroupSeparator;
        if (value.LastIndexOf(groupSep) + 4 == value.Count())
        {
            bool tryParse = double.TryParse(value, System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.CurrentCulture, out result);
            result = tryParse ? result : defaultValue;
        }
        else
        {
            // Unify string (no spaces, only . )
            output = value.Trim().Replace(" ", string.Empty).Replace(",", ".");
    
            // Split it on points
            string[] split = output.Split('.');
    
            if (split.Count() > 1)
            {
                // Take all parts except last
                output = string.Join(string.Empty, split.Take(split.Count()-1).ToArray());
    
                // Combine token parts with last part
                output = string.Format("{0}.{1}", output, split.Last());
            }
            // Parse double invariant
            result = double.Parse(output, System.Globalization.CultureInfo.InvariantCulture);
        }
        return result;
    }
    

提交回复
热议问题