为什么我解析的Double值不正确

本文关键字:Double 不正确 为什么 | 更新日期: 2023-09-27 18:11:19

我试图将字符串解析为Double。下面是我的代码:

string a = "10.23";
double b = Double.Parse(a);

但b是1023.0,我不知道为什么。我想得到10.23作为Double

为什么我解析的Double值不正确

这是因为您的区域性设置,您可以为Parse指定区域性方法以获得所需的输出:

string a = "10.23";
double b = double.Parse(a, System.Globalization.CultureInfo.InvariantCulture);
// b == 10.23

在德国,逗号(,)被用作小数点,而大多数英语文化和您的示例使用句号(.)作为小数点。由于Double.Parse使用线程默认区域性来解析数字,并且线程默认区域性设置为德语,因此您将得到错误的结果。

您应该显式地指定区域性:

using System.Globalization;
string a = "10.23";
double b = Double.Parse(a, CultureInfo.InvariantCulture);
不变量区域性使用句号作为小数点,所以我建议您使用它。或者,如果您从已知使用特定文化约定编写的源中获得字符串,则使用该文化来代替。

或者您的位置为数字格式化,试试这个我的来源:

Ext:

 public static class Ext
{
    public static double? AsLocaleDouble(this string str)
    {
        var result = double.NaN;
        var format = Thread.CurrentThread.CurrentUICulture.NumberFormat;
        double.TryParse(str, NumberStyles.AllowDecimalPoint, format, out result);
        return result;
    }
}
测试:

  class Program
{
    static void Main(string[] args)
    {
        var str = "10,23";
        Thread.CurrentThread.CurrentUICulture = new CultureInfo("uz-Cyrl-UZ");
        Thread.CurrentThread.CurrentCulture = new CultureInfo("uz-Cyrl-UZ");
        Console.WriteLine(str.AsLocaleDouble());
        Console.ReadKey(); 
    }
}