C#:使用点分隔符将字符串从数组转换为双精度

C#: Convert string from array to double wih dot separator

我正在 Visual Studio 中开发 Xamarin Android 应用程序。

我有一个这样的 GPS 坐标字符串数组:

*string[] DeviceLocations = { "23.2342;32.4544", "7.4321;9.5431", "12.4223;-23.3434" };*

为了能够像标记一样将它们传递到我的 Google 地图,必须将它们转换为双精度值 - 使用“.”作为分隔符。

我尝试了几种不同的方法来做到这一点,包括:

1)

Double lat = Convert.ToDouble(splitPos[0].ToString(), new CultureInfo("en-US"));

2)

NumberFormatInfo info = new NumberFormatInfo();
info.NumberGroupSeparator = ".";
info.NumberDecimalSeparator = ".";
Double lat = Double.Parse(splitPos[0].ToString(), info);

3)

Double lat = XmlConvert.ToDouble(splitPos[0].ToString());

4)

Double lat = double.Parse(splitPos[1].ToString(), CultureInfo.InvariantCulture);

但所有 returns "lat" 都带有“,”而不是“.”。

有人知道我可以尝试什么吗???我 运行 没主意了。

一个正确的方法是这样的:

private static readonly CultureInfo USCULTURE = new CultureInfo("en-US");

// Go over all items
foreach (string latlon in DeviceLocations)
{
    // Get the split result
    string[] coordinates = latlon.Split(';');

    // Lat is first item of split array, Lon is second item
    double lat = Convert.ToDouble(coordinates[0], USCULTURE);
    double lon = Convert.ToDouble(coordinates[0], USCULTURE);

    // Now do something with the double values
    ...
}

我不知道你所说的 所有 returns "lat" 都带有“,”而不是“.”是什么意思,但是双人只是双人。只有当你 输出 它时,才会有一个小数点分隔符。那么也许您输出数字的系统将 , 作为小数点分隔符?

在这种情况下,您需要强制输出使用美国格式:

string outputtableLat = lat.ToString("G", USCULTURE);
string outputtableLon = lon.ToString("G", USCULTURE);

以下会做:

public static IEnumerable<Tuple<double,double>> ParseCoordinates(this IEnumerable<string> points, IFormatProvider formatProvider)
{
    foreach (var point in points)
    {
        var coordinates = point.Split(';');
        double x = 0;
        double y = 0;

        if (!double.TryParse(coordinates[0], NumberStyles.Number, formatProvider, out x))
        {
            x = double.NaN;
        }

        if (!double.TryParse(coordinates[1], NumberStyles.Number, formatProvider, out y))
        {
            y = double.NaN;
        }

        yield return new Tuple<double, double>(x, y);
    }
}

我冒昧地返回 double.NaN 以防解析失败。不确定这在您的场景中是否有效,请相应地进行更改,但请确保您 有办法从格式错误的数据中恢复。

你会像这样使用它:

string[] deviceLocations = { "23.2342;32.4544", "7.4321;9.5431", "12.4223;-23.3434" };
var coordinates = deviceLocations.ParseCoordinates(new CultureInfo("en-US"));

现在您的坐标已解析。如果您想以任何特定文化输出它们,只需利用 IFormattable 接口:

Console.WriteLine(string.Join(Environment.NewLine, coordinates.Select(c => $"Lat: {c.Item1.ToString(CultureInfo.InvariantCulture)}; Long: {c.Item2.ToString(CultureInfo.InvariantCulture)}")));