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
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.Text
aprè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.
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.
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 :
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;
}
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:
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;
}
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.
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);
}
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);
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 .
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
.
exampleText
est String
et donc notre méthode d’extension est disponibleexampleText.TextFollowing()
utilise la méthode d'extensionIl 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
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.