0

我一直在使用 googlemaps,我现在正在寻找格式化坐标。

我得到以下格式的坐标:

地址(坐标)缩放级别。

我使用 indexof 方法获取“(”+1 的开始,以便获取坐标的第一个数字并将该值存储在我称为“start”的变量中。

然后我做同样的事情,但这次我得到“)”-2的索引来获取最后一个坐标的最后一个数字,并将这个值存储在一个我称之为“end”的变量中。

我收到以下错误:“索引和长度必须引用字符串中的位置。参数名称:长度”

我得到以下字符串作为参数:

"Loddvägen 155, 840 80 Lillhärdal, Sverige (61.9593214318303,14.0585965625)5"

根据我的计算,我应该在开始变量中获得值 36,在结束变量中获得值 65

但由于某种原因,我在开始时得到值 41,在结束时得到值 71。

为什么?

public string RemoveParantheses(string coord)
        {
            int start = coord.IndexOf("(")+1;
            int end = coord.IndexOf(")")-2;

            string formated = coord.Substring(start,end);
            return formated;
        }

然后我尝试硬编码正确的值

string Test = cord.Substring(36,65);

然后我收到以下错误:

startindex 不能大于字符串的长度。参数名称 startindex

我理解这两个错误的含义,但在这种情况下它们是不正确的,因为我没有超出字符串长度值。

谢谢!

4

6 回答 6

8

的第二个参数Substring是长度(MSDN 来源)。由于您要传入65第二个参数,因此您的调用试图获取 和 之间的36字符101 (36+65)。您的字符串中没有 101 个字符,因此会引发错误。要获取字符之间的数据(,请使用以下命令:

public string RemoveParantheses(string coord)
{
    int start = coord.IndexOf("(")+1;
    int end = coord.IndexOf(")")-2;

    string formated = coord.Substring(start, end - start);
    return formated;
}

编辑:它只使用坐标的原因是因为总字符串的长度较短,并且由于坐标从第一个位置开始,结束坐标是最后一个位置。例如...

//using "Loddvägen 155, 840 80 Lillhärdal, Sverige (61.9593214318303,14.0585965625)5"
int start = coord.IndexOf("(") + 1;  // 36
int end = coord.IndexOf(")")-2;      // 65
coord.Substring(start, end);         //looks at characters 35 through 101

//using (61.9593214318303,14.0585965625)5
int start = coord.IndexOf("(") + 1;  // 1
int end = coord.IndexOf(")")-2;      // 30
coord.Substring(start, end);         //looks at characters 1 through 31

第二个实例是有效的,因为 31 实际上存在于您的字符串中。一旦将地址添加到字符串的开头,您的代码将不再工作。

于 2013-04-25T13:09:29.290 回答
2

Substring()的重载需要两个参数,开始索引和长度。您已经提供了第二个值作为)您真正想要获取要修剪的字符串长度时出现的索引,在这种情况下,您可以)(. 例如: -

string foo = "Loddvägen 155, 840 80 Lillhärdal, Sverige (61.9593214318303,14.0585965625)5";
int start = foo.IndexOf("(") + 1;
int end = foo.IndexOf(")");
Console.Write(foo.Substring(start, end - start));
Console.Read();

或者,您可以使用正则表达式解析字符串,例如:-

Match r = Regex.Match(foo, @"\(([^)]*)\)");
Console.Write(r.Groups[1].Value);

这可能会比前面的例子好一点

于 2013-04-25T13:13:01.600 回答
2

提取字符串的一部分是正则表达式的一个很好的用途:

var match = Regex.Match(locationString, @"\((?<lat>[\d\.]+),(?<long>[\d\.]+)\)");

string latitude = match.Groups["lat"].Value;
string longitude = match.Groups["long"].Value;
于 2013-04-25T13:14:33.440 回答
1

您可能忘记计算换行符和其他空格,\r\n 换行符是 2 个“不可见”字符。另一个错误是您使用 (Start, End) 调用 Substring 而它的 (Start, Count) 或 (Start, End - Start)

于 2013-04-25T13:09:53.890 回答
1
string input = 
  "Loddvägen 155, 840 80 Lillhärdal, Sverige (61.9593214318303,14.0585965625)5";

var groups = Regex.Match(input, 
                         @"\(([\d\.]+),([\d\.]+)\)(\d{1,2})").Groups;
var lat = groups[1].Value;
var lon = groups[2].Value;
var zoom = groups[3].Value;
于 2013-04-25T13:14:49.197 回答
1

根据我的计算,我应该在开始变量中获得值 36,在结束变量中获得值 65

那么你的计算是错误的。通过上面的字符串,我还看到(并且 LinqPad 确认)打开的括号位于位置 42,而关闭的括号位于索引 73。

使用时遇到的错误Substring是因为参数 toSubstring是开始位置和长度,而不是结束位置,所以你应该使用:

string formated = coord.Substring(start,(end-start+1));
于 2013-04-25T13:15:07.570 回答