我正在Visual Studio中开发一个Xamarin Android应用程序。
我有一个像这样的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 :(得分: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 :(得分: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)}")));