mais le code VB repose sur la fonction c # Substring dans strings.sc
Our Man in Bananas
Ce n'est pas vraiment une très bonne façon de le faire, mais si vous êtes dans un pincement, vous pouvez ajouter une référence à Microsoft.VisualBasic.dll et utiliser la méthode Right. Ce n'est pas une méthode d'extension. Vous devez l'utiliser comme ceci:string endOfString = Strings.Right(wholeString, 6);
Cette approche ne fonctionne pas correctement si la chaîne n'est pas aussi longue que le nombre de caractères requis.
stevehipwell
1
En fonction de ce que veut exactement l'OP, on peut également lancer des expressions régulières. S'il ne veut que le nombre à la fin de la chaîne, c'est certainement la solution la plus indolore, surtout lorsque le nombre de chiffres peut varier lors d'une mise à niveau logicielle ultérieure.
Joey
2
@Johannes Rössel - Je suis un grand fan des expressions régulières (voir mes réponses), mais je ne les recommanderais jamais pour une situation simple comme celle-ci. Toutes les réponses qui utilisent un wrapper de fonction sont mieux adaptées à la maintenance du code qu'une expression régulière. Une méthode d'extension (ou une fonction standard si .NET 2.0) est la meilleure solution.
stevehipwell
@ Stevo3000 - avoir une solution qui lance si la chaîne est de la mauvaise longueur est une solution valide. Pas la seule solution, mais quand même.
Marc L.
3
@James - pour être tout aussi pernickity, seul le titre mentionnait "n lettres". La vraie question posée demandait "les six lettres les plus à droite" :)
Chris Rogers
69
Écrivez une méthode d'extension pour exprimer la Right(n);fonction. La fonction doit traiter des chaînes nulles ou vides renvoyant une chaîne vide, des chaînes plus courtes que la longueur maximale renvoyant la chaîne d'origine et des chaînes plus longues que la longueur maximale renvoyant la longueur maximale des caractères les plus à droite.
publicstaticstringRight(thisstring sValue,int iMaxLength){//Check if the value is validif(string.IsNullOrEmpty(sValue)){//Set valid empty string as string could be null
sValue =string.Empty;}elseif(sValue.Length> iMaxLength){//Make the string no longer than the max length
sValue = sValue.Substring(sValue.Length- iMaxLength, iMaxLength);}//Return the stringreturn sValue;}
L'index de départ ne peut pas non plus être inférieur à 0.
James
2
@James - Ce ne sera pas comme sValue.Length > iMaxLengthavant l'appel d'une sous-chaîne!
stevehipwell
3
Excellente réponse, mais c'était un peu une double prise pour voir la notation hongroise en code C #.
Jerad Rose
1
@JeradRose - Je travaille dans un projet où la base de code a évolué à partir d'une application VB3 (la plupart de ceci est VB.NET) donc il y a quelques restes.
stevehipwell
4
@Jalle, VB.NET a Left, Right et Mid comme fonctions de niveau supérieur, ainsi que de nombreuses autres choses utiles qui ne font pas partie de C #. Je ne sais pas pourquoi, car beaucoup d'entre elles sont des fonctions décentes.
ingrédient_15939
40
Probablement plus agréable d'utiliser une méthode d'extension:
Ensuite, il lèverait une NullReferenceException comme si vous essayiez d'utiliser n'importe quelle méthode sur une chaîne nulle ...
James
1
str.Length - lengthpourrait être négatif. Le deuxième paramètre est également facultatif. Pas besoin de passer la longueur.
iheartcsharp
1
@ JMS10 cela pourrait certainement être, mais c'est plus le problème des appelants que le mien. De plus, oui, justement, vous pouvez utiliser le remplacement qui ne prend que le paramètre unique ici.
Ne devrait pas faire d'erreur, renvoie des valeurs nulles sous forme de chaîne vide, renvoie des valeurs réduites ou de base. Utilisez-le comme "testx" .Left (4) ou str.Right (12);
si vous n'êtes pas sûr de la longueur de votre chaîne, mais que vous êtes sûr que les mots comptent (toujours 2 mots dans ce cas, comme «xxx yyyyyy»), vous feriez mieux d'utiliser split.
stringResult="PER 343573".Split(" ")[1];
cela renvoie toujours le deuxième mot de votre chaîne.
Oui; Supposons simplement que le texte de OP ait TOUJOURS des espaces blancs; comme dans son exemple :)
Christian
1
Hei Christian :) nous en savons tous plus que quelques lignes de réponse. Je viens de répondre à la question brièvement, bien sûr, il y a beaucoup plus de choses à considérer dans le vrai code.
Mahdi Tahsildari le
7
Ce n'est pas exactement ce que vous demandez, mais en regardant simplement l'exemple, il semble que vous recherchez la section numérique de la chaîne.
Si c'est toujours le cas, une bonne façon de le faire serait d'utiliser une expression régulière.
var regex=newRegex("\n+");string numberString = regex.Match(page).Value;
-1 les expressions régulières sont un peu exagérées pour quelque chose comme ça, surtout quand il existe déjà des méthodes intégrées pour le faire.
James
1
Je ne suis pas en faveur de l'utilisation de cette méthode si vous n'avez vraiment besoin que des 6 derniers, mais si votre objectif est d'extraire un nombre (tel qu'un identifiant) qui pourrait changer en 5 ou 7 chiffres à un moment donné dans le futur, ceci est un meilleur moyen.
frissons42
1
Ancienne réponse, mais +1 pour prendre en charge l'utilisation d'expressions régulières. D'autant qu'il n'y a (toujours) aucune méthode intégrée dans l'implémentation String de .NET pour faire cela @James. Sinon, cette question n'a peut-être jamais existé.
CrazyIvan1974
@ CrazyIvan1974 ne sais pas pourquoi vous m'avez mentionné dans votre commentaire
James
5
Utilisez ceci:
String text ="PER 343573";String numbers = text;if(text.Length>6){
numbers = text.Substring(text.Length-6);}
Deviner à vos besoins, mais l'expression régulière suivante ne donnera que 6 alphanumériques avant la fin de la chaîne et aucune correspondance dans le cas contraire.
string result =Regex.Match("PER 343573",@"[a-zA-Z\d]{6}$").Value;
using Microsoft.VisualBasic;...string input ="PER 343573";string output =Strings.Right(input,6);
Pas besoin de créer une méthode d'extension personnalisée ou autre travail. Le résultat est obtenu avec une référence et une simple ligne de code.
Pour plus d'informations à ce sujet, l'utilisation de méthodes Visual Basic avec C # a été documentée ailleurs . Personnellement, je suis tombé dessus en essayant d'analyser un fichier, et j'ai trouvé que ce fil SO sur l'utilisation de la Microsoft.VisualBasic.FileIO.TextFieldParserclasse était extrêmement utile pour analyser les fichiers .csv.
cela prend en charge n'importe quel nombre de caractères dans le str. le code alternatif ne prend pas en charge la nullchaîne. et, le premier est plus rapide et le second est plus compact.
je préfère le second si je connais la strchaîne courte contenant. si c'est une longue chaîne, la première est plus appropriée.
Voici la solution que j'utilise ... Elle vérifie que la longueur de la chaîne d'entrée n'est pas inférieure à la longueur demandée. Les solutions que je vois publiées ci-dessus n'en tiennent malheureusement pas compte - ce qui peut entraîner des plantages.
/// <summary>/// Gets the last x-<paramref name="amount"/> of characters from the given string./// If the given string's length is smaller than the requested <see cref="amount"/> the full string is returned./// If the given <paramref name="amount"/> is negative, an empty string will be returned./// </summary>/// <param name="string">The string from which to extract the last x-<paramref name="amount"/> of characters.</param>/// <param name="amount">The amount of characters to return.</param>/// <returns>The last x-<paramref name="amount"/> of characters from the given string.</returns>publicstaticstringGetLast(thisstring@string,int amount){if(@string==null){return@string;}if(amount <0){returnString.Empty;}if(amount >=@string.Length){return@string;}else{return@string.Substring(@string.Length- amount);}}
Le code doit être accompagné d'une explication écrite expliquant comment il résout le problème dans l'OP.
Zze
1
Eh bien, je pensais qu'une explication écrite dans les commentaires était suffisante, non?
vldmrrr
0
Sans recourir au convertisseur de bits et au décalage de bits (il faut être sûr de l'encodage), c'est la méthode la plus rapide que j'utilise comme méthode d'extension «Droite».
string myString ="123456789123456789";if(myString >6){char[] cString = myString.ToCharArray();Array.Reverse(myString);Array.Resize(ref myString,6);Array.Reverse(myString);string val =newstring(myString);}
Array.Reverseprend un tableau, pas une chaîne, et if (myString.length > 6). Mis à part les erreurs de syntaxe, pourquoi serait-ce la méthode la plus rapide? Utiliser simplement une sous-chaîne serait certainement un meilleur moyen, cela ne nécessiterait pas toute cette copie de tableaux.
1800 INFORMATION
0
J'utilise le Min pour éviter les situations négatives et gère également les chaînes nulles
// <summary>/// Returns a string containing a specified number of characters from the right side of a string./// </summary>publicstaticstringRight(thisstringvalue,int length){string result =value;if(value!=null)
result =value.Substring(0,Math.Min(value.Length, length));return result;}
string endOfString = Strings.Right(wholeString, 6);
Réponses:
la source
Écrivez une méthode d'extension pour exprimer la
Right(n);
fonction. La fonction doit traiter des chaînes nulles ou vides renvoyant une chaîne vide, des chaînes plus courtes que la longueur maximale renvoyant la chaîne d'origine et des chaînes plus longues que la longueur maximale renvoyant la longueur maximale des caractères les plus à droite.la source
sValue.Length > iMaxLength
avant l'appel d'une sous-chaîne!Probablement plus agréable d'utiliser une méthode d'extension:
Usage
la source
str.Length - length
pourrait être négatif. Le deuxième paramètre est également facultatif. Pas besoin de passer la longueur.Ne devrait pas faire d'erreur, renvoie des valeurs nulles sous forme de chaîne vide, renvoie des valeurs réduites ou de base. Utilisez-le comme "testx" .Left (4) ou str.Right (12);
la source
MSDN
EDIT: trop lent ...
la source
si vous n'êtes pas sûr de la longueur de votre chaîne, mais que vous êtes sûr que les mots comptent (toujours 2 mots dans ce cas, comme «xxx yyyyyy»), vous feriez mieux d'utiliser split.
cela renvoie toujours le deuxième mot de votre chaîne.
la source
Ce n'est pas exactement ce que vous demandez, mais en regardant simplement l'exemple, il semble que vous recherchez la section numérique de la chaîne.
Si c'est toujours le cas, une bonne façon de le faire serait d'utiliser une expression régulière.
la source
Utilisez ceci:
la source
Deviner à vos besoins, mais l'expression régulière suivante ne donnera que 6 alphanumériques avant la fin de la chaîne et aucune correspondance dans le cas contraire.
la source
Puisque vous utilisez .NET, qui se compile tous vers MSIL , référencez simplement Microsoft.VisualBasic et utilisez la
Strings.Right
méthode intégrée de Microsoft :Pas besoin de créer une méthode d'extension personnalisée ou autre travail. Le résultat est obtenu avec une référence et une simple ligne de code.
Pour plus d'informations à ce sujet, l'utilisation de méthodes Visual Basic avec C # a été documentée ailleurs . Personnellement, je suis tombé dessus en essayant d'analyser un fichier, et j'ai trouvé que ce fil SO sur l'utilisation de la
Microsoft.VisualBasic.FileIO.TextFieldParser
classe était extrêmement utile pour analyser les fichiers .csv.la source
cela prend en charge n'importe quel nombre de caractères dans le
str
. le code alternatif ne prend pas en charge lanull
chaîne. et, le premier est plus rapide et le second est plus compact.je préfère le second si je connais la
str
chaîne courte contenant. si c'est une longue chaîne, la première est plus appropriée.par exemple
ou
la source
Utilisez ceci:
string mystr = "PER 343573"; int number = Convert.ToInt32(mystr.Replace("PER ",""));
la source
Une autre solution qui peut ne pas être mentionnée
la source
Méthodes Null Safe:
Chaînes plus courtes que la longueur maximale renvoyant la chaîne d'origine
Méthode d'extension de la chaîne droite
Méthode d'extension de chaîne à gauche
la source
Voici la solution que j'utilise ... Elle vérifie que la longueur de la chaîne d'entrée n'est pas inférieure à la longueur demandée. Les solutions que je vois publiées ci-dessus n'en tiennent malheureusement pas compte - ce qui peut entraîner des plantages.
la source
C'est la méthode que j'utilise: j'aime garder les choses simples.
la source
Juste une pensée:
la source
la source
Sans recourir au convertisseur de bits et au décalage de bits (il faut être sûr de l'encodage), c'est la méthode la plus rapide que j'utilise comme méthode d'extension «Droite».
la source
Array.Reverse
prend un tableau, pas une chaîne, etif (myString.length > 6)
. Mis à part les erreurs de syntaxe, pourquoi serait-ce la méthode la plus rapide? Utiliser simplement une sous-chaîne serait certainement un meilleur moyen, cela ne nécessiterait pas toute cette copie de tableaux.J'utilise le Min pour éviter les situations négatives et gère également les chaînes nulles
la source
la sortie est "Word"
la source