web-dev-qa-db-fra.com

Récupère String après String.indexof en c #

Je développe actuellement une application en C # où je dois obtenir la sous-chaîne après un certain caractère de la chaîne. 

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);
}

Pour une raison quelconque, il continue à proposer IndexOutOfRangeException. Comment puis-je obtenir le contenu de la chaîne de l'index à la fin?

Merci pour toute l'aide que vous pouvez apporter.

EDIT: Je viens de constater que les différentes choses que j'ai essayées qui ont été suggérées semblent fonctionner, sauf que la valeur du dernier bouton enfoncé dans le champ de texte n'a pas été ajoutée. J'utilise l'événement KeyPress pour ce faire. 

Par exemple, si je saisis .123, cela n’imprimera que 12. Ensuite, si j’ajoute 4 à la fin, cela affichera 123

13
Boardy

La surcharge de String.Substring que vous utilisez prend un index de départ et une longueur spécifiée. En tant qu'index de départ, vous utilisez l'emplacement ".", mais en tant que longueur, vous utilisez la longueur de la chaîne entière. Si index est supérieur à 0, cela provoquera une exception (comme vous l'avez vu).

Au lieu de cela, utilisez simplement ceci:

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

Tous les caractères contenus dans txtPriceLimit.Textaprès l'emplacement de "." seront affichés. Notez que nous devons ajouter 1 à l'index; sinon, "." sera inclus dans la sous-chaîne résultante. 

27
Donut

Essayez simplement de faire cela à la place

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

Cela suppose qu'il n'y a que 1 . dans la chaîne et qu'il y en aura 1 dans la chaîne.

4
msarchet

Il semble que beaucoup de gens trouvent cela utile, alors je voulais contribuer au code que j'ai créé pour la communauté.

C'est une méthode d'extension que j'ai écrite et qui retournera le texte dans cette chaîne txt après le paramètre valeur de chaîne :

Listing 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;
}

Exemple 1:

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

Pour les personnes qui ne sont pas passées par les méthodes d'extension, vous pouvez obtenir les mêmes résultats avec un outil défini de la même façon:

Listing 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;
}

Exemple 2:

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

Dans chacun des exemples ci-dessus, si exampleText avait été une chaîne vide, la valeur de recherche était null ou une chaîne vide, ou si la valeur de recherche n'était pas trouvée, la chaîne résultante serait null.

J'ai ce code dans ma liste d'outils où il est utilisé à d'innombrables endroits dans de nombreux projets et il fonctionne toujours très bien.

2
jp2code

Utilisez ceci, cela fonctionnera certainement: -

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);
}
2
Ankush Roy

La réponse de Donut est la bonne.

Comme le deuxième paramètre de Substring est length not 'end index', sa réponse est l'équivalent beaucoup plus net de:

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

Version VisualBasic

Code pour rechercher une sous-chaîne, le cas échéant, retourne la partie finale - le reste de la chaîne immédiatement derrière (fin), de la sous-chaîne trouvée. 

La réponse de jp2code me convenait parfaitement. En plus d'exemples, l'auteur a également indiqué que le code avait été bien essayé et testé au fil du temps. VisualBasic équivalent de son code:

Imports System.Runtime.CompilerServices

Module StringExtensions
    <Extension()>
    Public Function TextFollowing(txt As String, value As String) As String
        If Not String.IsNullOrEmpty(txt) AndAlso Not String.IsNullOrEmpty(value) Then
            Dim index As Integer = txt.IndexOf(value)
            If -1 < index Then
                Dim start As Integer = index + value.Length
                If start <= txt.Length Then
                    Return txt.Substring(start)
                End If
            End If
        End If
        Return Nothing
    End Function
End Module

Le code a été testé avec VS Community 2017

Exemple d'utilisation

Dim exampleText As String = "C-sharp to VisualBasic"
Dim afterCSharp = exampleText.TextFollowing("to")
'afterCSharp = " VisualBasic"

La méthode d'extension TextFollowing() est maintenant disponible pour les objets String

  1. Ligne 1: exampleText est String et donc notre méthode d’extension est disponible
  2. Ligne 2: exampleText.TextFollowing() utilise la méthode d'extension

Méthode complémentaire

Il peut être utile d’avoir la méthode complémentaire - obtenir la partie précédente de la chaîne. Les méthodes d'extension complémentaires sont écrites et placées ensemble dans un module de code combiné: 

Imports System.Runtime.CompilerServices

Module StringExtensions
    <Extension()>
    Public Function TextFollowing(txt As String, value As String) As String
        If Not String.IsNullOrEmpty(txt) AndAlso Not String.IsNullOrEmpty(value) Then
            Dim index As Integer = txt.IndexOf(value)
            If -1 < index Then
                Dim start As Integer = index + value.Length
                If start <= txt.Length Then
                    Return txt.Substring(start)
                End If
            End If
        End If
        Return Nothing
    End Function
    <Extension()>
    Public Function TextPreceding(txt As String, value As String) As String
        If Not String.IsNullOrEmpty(txt) AndAlso Not String.IsNullOrEmpty(value) Then
            Dim index As Integer = txt.IndexOf(value)
            If -1 < index Then
                Return txt.Substring(0, index)
            End If
        End If
        Return Nothing
    End Function
End Module

Exemple d'utilisation

Dim exampleText As String = "C-sharp to VisualBasic"
Dim beforeVisualBasic = exampleText.TextPreceding("to")
'beforeVisualBasic = "C-sharp "

Dans mon cas d'utilisation, il est nécessaire de vérifier si LargeString.Contains(SmallString) avant d'utiliser ces méthodes d'extension. Pour une exécution plus rapide du code, cela aurait pu être combiné aux méthodes d'extension présentées ci-dessus, ce que je n'ai pas fait. Ceci est dû au fait qu’aucune lenteur n’est ressentie, la préférence va donc à la réutilisation du code. 

0
coarist