簡體   English   中英

如何獲取IndexOf()方法以返回正確的值?

[英]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 ,因此您的呼叫正在嘗試使字符介於36101 (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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM