[英]How can I get the IndexOf() method to return the correct values?
我一直在使用googlemaps,現在正在尋找格式化坐標的方法。
我得到以下格式的坐標:
地址(坐標)縮放級別。
我使用indexof方法獲取“(” +1)的開頭,以便獲取坐標的第一個數字,並將此值存儲在我稱為“開始”的變量中。
然后,我也做同樣的事情,但是這次我得到“)”-2的索引,以獲取最后一個坐標的最后一個數字,並將此值存儲在我稱為“結束”的變量中。
我收到以下錯誤:“索引和長度必須引用字符串中的位置。參數名稱:length”
我得到以下字符串作為參數:
"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
我理解這兩個錯誤的含義,但是在這種情況下,它們是不正確的,因為我沒有超出字符串長度值。
謝謝!
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個實例。 將地址添加到字符串的開頭后,您的代碼將不再起作用。
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);
可能會比之前的示例表現更好
提取字符串的一部分對於正則表達式非常有用:
var match = Regex.Match(locationString, @"\((?<lat>[\d\.]+),(?<long>[\d\.]+)\)");
string latitude = match.Groups["lat"].Value;
string longitude = match.Groups["long"].Value;
您可能忘了數換行符和其他空格,\\ r \\ n換行符是2個“不可見”字符。 另一個錯誤是您在使用(開始,結束)或(開始,結束-開始)時使用(開始,結束)調用子字符串
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;
通過我的計算,我應該在開始變量中獲得值36,在結束變量中獲得值65
那么您的計算是錯誤的。 在上面的字符串中,我還看到(並且LinqPad確認)打開的括號位於位置42,關閉的括號位於索引73。
您正在使用的時候得到的錯誤Substring
是監守的參數Substring
是一個開始位置和長度 ,而不是結束位置,所以你應該使用:
string formated = coord.Substring(start,(end-start+1));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.