2016-12-07 147 views
0

我正在Visual Studio中开发Xamarin Android应用程序。C#:将字符串从数组转换为双精度分隔符

我有GPS的字符串数组坐标如下:

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

为了能够将它们传递给我的谷歌地图状的标记,他们必须被转换为双值 - 用”。 “作为分隔符。

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

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); 

但是他们都用“,”而不是“。”返回“lat”。

任何人有任何其他的想法,我可以尝试?我正在用尽想法。

+0

你如何得到'splitPos'? – ThePerplexedOne

+0

我在split循环中获取splitPos,如下所示:_string [] splitPos = DeviceLocations [i] .Split(';'); _ – SorenA

+0

问题不在于解析我相信的数字。问题在于输出号码时。那就是你需要指定的格式。使用'CultureInfo'或'NumberFormatInfo'。 –

回答

3

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

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 
    ... 
} 

我不知道你的所有这些意味着什么返回“LAT”用“”代替“”,但双倍只是一个双。只有当你输出它,有一个小数点分隔符。所以也许你输出数字的系统有,作为小数点分隔符?

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

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

下面会做:

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)}"))); 
相关问题