0

私はグーグルマップで作業しており、現在座標のフォーマットを探しています。

次の形式で座標を取得します。

アドレス (座標) ズーム レベル。

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

の 2 番目のパラメーターSubstringは長さです ( MSDN source )。652 番目のパラメーターを渡しているため、呼び出しは と の間の文字を取得しよう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 が文字列に実際に存在したため、2 番目のインスタンスは有効でした。文字列の先頭にアドレスを追加すると、コードは機能しなくなります。

于 2013-04-25T13:09:29.290 に答える
2

このSubstring()のオーバーロードは、開始インデックスと長さの 2 つのパラメーターを取ります。)トリミングしたい文字列の長さを実際に取得したい場合、 の出現のインデックスとして 2 番目の値を指定しました。この場合、 のインデックス)から のインデックスを引くことができます(。例えば: -

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 つの「見えない」文字です。もう 1 つの間違いは、Substring を (Start, End) で呼び出し、その (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 を取得する必要があります

それならあなたの計算は間違っています。上記の文字列では、開き括弧が位置 42 にあり、閉じ括弧がインデックス 73 にあることもわかります (そして LinqPad が確認します)。

使用時に発生するエラーSubstringは、パラメーターSubstringが開始位置と長さであり、終了位置ではないため、次を使用する必要があります。

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