17 Stimmen

String nach String.indexof in c# abrufen

Ich entwickle derzeit eine Anwendung in C#, wo ich die Teilzeichenfolge nach einem bestimmten Zeichen innerhalb der Zeichenfolge erhalten müssen.

else if (txtPriceLimit.Text.Contains('.') && char.IsNumber(e.KeyChar))
{
    int index = txtPriceLimit.Text.IndexOf('.');
    string pennies = txtPriceLimit.Text.Substring(index, txtPriceLimit.Text.Length);
    Console.WriteLine("Pennies: " + pennies);
}

Aus irgendeinem Grund erscheint immer wieder eine IndexOutOfRangeException . Wie kann ich den Inhalt der Zeichenkette vom Index bis zum Ende erhalten?

Danke für jede Hilfe, die Sie anbieten können.

EDIT: Ich habe gerade festgestellt, dass die verschiedenen Dinge, die ich ausprobiert habe und die vorgeschlagen wurden, zu funktionieren scheinen, außer dass der Wert der zuletzt gedrückten Taste nicht in das Textfeld übernommen wird. Ich bin mit der KeyPress Event, um dies zu tun.

Wenn ich zum Beispiel .123 eingebe, wird nur 12 gedruckt. Wenn ich dann 4 am Ende hinzufüge, wird 123 gedruckt.

33voto

Donut Punkte 103447

En Überlastung von String.Substring die Sie verwenden, benötigt einen Startindex und eine bestimmte Länge. Als Startindex verwenden Sie die Position von " . ", aber als Länge verwenden Sie die Länge der gesamten Zeichenkette. Wenn index es größer als 0 wird dies eine Ausnahme verursachen (wie Sie gesehen haben).

Verwenden Sie stattdessen einfach dies:

string pennies = txtPriceLimit.Text.Substring(index + 1);

Dadurch werden alle Zeichen innerhalb von txtPriceLimit.Text nach den Standort von " . ". Beachten Sie, dass wir dem Index eine 1 hinzufügen müssen, da sonst " . " wird in die resultierende Teilzeichenkette aufgenommen.

4voto

msarchet Punkte 14846

Versuchen Sie stattdessen Folgendes

string pennies = txtPriceLimit.Text.Split('.')(1);

Dabei wird davon ausgegangen, dass es nur 1 . in der Zeichenkette, und dass es 1 in der Zeichenkette sein wird.

3voto

jp2code Punkte 25327

Es sieht so aus, als ob eine Menge Leute dies nützlich finden, also wollte ich der Gemeinschaft etwas von mir erstellten Code zur Verfügung stellen.

Dies ist eine von mir geschriebene Erweiterungsmethode, die den Text in diese Zeichenfolge txt nach dem Parameter Stringwert :

Auflistung 1:

public static string TextFollowing(this string txt, string value) {
  if (!String.IsNullOrEmpty(txt) && !String.IsNullOrEmpty(value)) {
    int index = txt.IndexOf(value);
    if (-1 < index) {
      int start = index + value.Length;
      if (start <= txt.Length) {
        return txt.Substring(start);
      }
    }
  }
  return null;
}

Beispiel 1:

string exampleText = "My cat is bad.";
string afterCat = exampleText.TextFollowing("cat");
// afterCat = " is bad.";

Für diejenigen, die nicht zu Extension Methods übergegangen sind, können Sie die gleichen Ergebnisse mit einem ähnlich definierten Werkzeug erzielen:

Auflistung 2:

public static string TextFollowing(string searchTxt, string value) {
  if (!String.IsNullOrEmpty(searchTxt) && !String.IsNullOrEmpty(value)) {
    int index = searchTxt.IndexOf(value);
    if (-1 < index) {
      int start = index + value.Length;
      if (start <= searchTxt.Length) {
        return searchTxt.Substring(start);
      }
    }
  }
  return null;
}

Beispiel 2:

string exampleText = "My cat is bad.";
string afterCat = TextFollowing(exampleText, "cat");
// afterCat = " is bad.";

In jedem der oben genannten Beispiele, wenn exampleText ein leerer String gewesen wäre, wäre der Suchwert null oder Empty String, oder wenn der Suchwert nicht gefunden wird, würde die resultierende Zeichenfolge lauten null .

Ich habe diesen Code in meiner Liste von Tools, wo er an unzähligen Stellen in zahlreichen Projekten verwendet wird, und er funktioniert immer hervorragend.

2voto

Ankush Roy Punkte 1611

Benutzen Sie dies, das wird bestimmt funktionieren :-

else if (txtPriceLimit.Text.Contains('.') && char.IsNumber(e.KeyChar))
{
    int index = txtPriceLimit.Text.IndexOf('.');
    string pennies = txtPriceLimit.Text.Substring(index+1, txtPriceLimit.Text.Length-(index+1));
    pennies=pennies+e.KeyChar.ToString();
    Console.WriteLine("Pennies: " + pennies);
}

1voto

John Arlen Punkte 6339

Die Antwort von Donut ist die richtige.

Da der zweite Parameter von Substring Länge nicht "Endindex", seine Antwort ist das viel sauberere Äquivalent von:

string pennies = txtPriceLimit.Text.Substring(index, index-txtPriceLimit.Text.Length);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X