ale kod VB opiera się na funkcji c # Substring w strings.sc
Our Man in Bananas
To naprawdę nie jest dobry sposób, aby to zrobić, ale jeśli masz problem, możesz dodać odwołanie do Microsoft.VisualBasic.dll i użyć metody Right. Nie jest to metoda rozszerzająca. Musisz go używać w ten sposób:string endOfString = Strings.Right(wholeString, 6);
To podejście nie działa poprawnie, jeśli ciąg nie jest tak długi, jak wymagana liczba znaków.
stevehipwell
1
W zależności od tego, czego dokładnie chce OP, można również rzucić na to wyrażenia regularne. Jeśli chce tylko cyfry na końcu ciągu, jest to zdecydowanie najbardziej bezbolesne rozwiązanie, zwłaszcza gdy liczba cyfr może się różnić w niektórych późniejszych aktualizacjach oprogramowania.
Joey
2
@Johannes Rössel - Jestem wielkim fanem wyrażeń regularnych (zobacz moje odpowiedzi), ale nigdy nie polecałbym ich w tak prostej sytuacji, jak ta. Wszystkie odpowiedzi, które używają opakowania funkcji, lepiej nadają się do obsługi kodu niż wyrażenie regularne. Najlepszym rozwiązaniem jest metoda rozszerzenia (lub standardowa funkcja w przypadku .NET 2.0).
stevehipwell
@ Stevo3000 - posiadanie rozwiązania, które rzuca, jeśli ciąg ma złą długość, jest prawidłowym rozwiązaniem. Nie jedyne rozwiązanie, ale wciąż.
Marc L.
3
@James - aby być tak samo złośliwym, tylko w tytule wspomniano „n liter”. Rzeczywiste zadane pytanie dotyczyło „prawych sześciu liter” :)
Chris Rogers
69
Napisz metodę rozszerzającą, aby wyrazić Right(n);funkcję. Funkcja powinna radzić sobie z pustymi lub pustymi łańcuchami zwracającymi pusty ciąg, łańcuchami krótszymi niż maksymalna długość zwracającymi oryginalny ciąg i ciągami dłuższymi niż maksymalna długość zwracającymi maksymalną długość skrajnych prawych znaków.
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;}
Indeks początkowy również nie może być mniejszy niż 0.
James
2
@James - Nie będzie tak, jak sValue.Length > iMaxLengthprzed wywołaniem podciągu!
stevehipwell
3
Świetna odpowiedź, ale zobaczenie węgierskiej notacji w kodzie C # wymagało trochę podwójnego podejścia.
Jerad Rose
1
@JeradRose - Pracuję w projekcie, w którym baza kodu wyewoluowała z aplikacji VB3 (w większości jest to VB.NET), więc są tam pewne pozostałości.
stevehipwell
4
@Jalle, VB.NET ma Left, Right i Mid jako funkcje najwyższego poziomu oraz wiele innych przydatnych rzeczy, które nie są częścią C #. Nie wiem dlaczego, ponieważ wiele z nich to przyzwoite funkcje.
składnik_15939
40
Prawdopodobnie przyjemniej jest użyć metody rozszerzenia:
Następnie zgłosiłby wyjątek NullReferenceException, tak jak w przypadku próby użycia dowolnej metody na łańcuchu zerowym ...
James
1
str.Length - lengthmoże być negatywne. Również drugi parametr jest opcjonalny. Nie musisz przekraczać długości.
iheartcsharp
1
@ JMS10 to z pewnością mogłoby być, ale to bardziej dotyczy dzwoniących niż moich. Poza tym, tak słuszna uwaga, możesz użyć zastąpienia, które pobiera tutaj tylko pojedynczy parametr.
Nie powinien popełniać błędu, zwraca wartości null jako pusty ciąg, zwraca wartości przycięte lub podstawowe. Użyj go jak "testx" .Left (4) lub str.Right (12);
Tak; załóżmy po prostu, że tekst OP ZAWSZE ma spacje; jak na swoim przykładzie :)
Christian
1
Hei Christian :) wszyscy znamy więcej niż kilka linijek odpowiedzi. Po prostu odpowiedziałem na to pytanie w skrócie, oczywiście, w prawdziwym kodzie jest o wiele więcej rzeczy do rozważenia.
Mahdi Tahsildari
7
Nie jest to dokładnie to, o co prosisz, ale patrząc na przykład, wydaje się, że szukasz numerycznej części ciągu.
Jeśli tak jest zawsze, dobrym sposobem na zrobienie tego byłoby użycie wyrażenia regularnego.
var regex=newRegex("\n+");string numberString = regex.Match(page).Value;
-1 wyrażenia regularne są trochę przesadą w przypadku czegoś takiego, zwłaszcza gdy istnieją już wbudowane metody do tego.
James
1
Nie będę argumentował za użyciem tej metody, jeśli naprawdę potrzebujesz tylko ostatnich 6, ale jeśli Twoim celem jest wyodrębnienie liczby (takiej jak identyfikator), która może zmienić się na 5 lub 7 cyfr w pewnym momencie w przyszłości, to to lepszy sposób.
dreszcze42
1
Stara odpowiedź, ale +1 do obsługi wyrażeń regularnych. Zwłaszcza, że nie ma (nadal) żadnych wbudowanych metod w implementacji String .NET do zrobienia tego @James. W przeciwnym razie to pytanie mogłoby nigdy nie istnieć.
CrazyIvan1974
@ CrazyIvan1974 nie jestem pewien, dlaczego wspomniałeś o mnie w swoim komentarzu
James
5
Użyj tego:
String text ="PER 343573";String numbers = text;if(text.Length>6){
numbers = text.Substring(text.Length-6);}
Zgaduję twoje wymagania, ale poniższe wyrażenie regularne zwróci tylko 6 znaków alfanumerycznych przed końcem ciągu i nie będzie pasować w innym przypadku.
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);
Nie ma potrzeby tworzenia niestandardowej metody rozszerzenia ani innej pracy. Wynik uzyskuje się za pomocą jednego odniesienia i jednego prostego wiersza kodu.
Jako dalsze informacje na ten temat, użycie metod języka Visual Basic w języku C # zostało udokumentowane w innym miejscu . Osobiście natknąłem się na to pierwszy, próbując przeanalizować plik i stwierdziłem, że ten wątek SO dotyczący używania Microsoft.VisualBasic.FileIO.TextFieldParserklasy jest niezwykle przydatny do analizowania plików .csv.
Oto rozwiązanie, którego używam ... Sprawdza, czy długość ciągu wejściowego nie jest mniejsza niż długość zadana. Powyższe rozwiązania, które widzę, niestety nie uwzględniają tego - co może prowadzić do awarii.
/// <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);}}
Do kodu należy dołączyć pisemne wyjaśnienie, w jaki sposób rozwiązuje problem w PO.
Zze
1
Cóż, myślałem, że wystarczy pisemne wyjaśnienie w komentarzach, nie?
vldmrrr
0
Bez uciekania się do konwertera bitów i przesuwania bitów (trzeba mieć pewność kodowania) jest to najszybsza metoda, której używam jako metoda rozszerzenia „Right”.
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.Reverseprzyjmuje tablicę, a nie ciąg, i if (myString.length > 6). Pomijając błędy składniowe, dlaczego byłaby to najszybsza metoda? Z pewnością samo użycie podciągów byłoby lepszym sposobem, nie wymagałoby to całego kopiowania tablic.
1800 INFORMACJE,
0
Używam Min, aby zapobiec negatywnym sytuacjom, a także obsługuję ciągi zerowe
// <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);
Odpowiedzi:
źródło
Napisz metodę rozszerzającą, aby wyrazić
Right(n);
funkcję. Funkcja powinna radzić sobie z pustymi lub pustymi łańcuchami zwracającymi pusty ciąg, łańcuchami krótszymi niż maksymalna długość zwracającymi oryginalny ciąg i ciągami dłuższymi niż maksymalna długość zwracającymi maksymalną długość skrajnych prawych znaków.źródło
sValue.Length > iMaxLength
przed wywołaniem podciągu!Prawdopodobnie przyjemniej jest użyć metody rozszerzenia:
Stosowanie
źródło
str.Length - length
może być negatywne. Również drugi parametr jest opcjonalny. Nie musisz przekraczać długości.Nie powinien popełniać błędu, zwraca wartości null jako pusty ciąg, zwraca wartości przycięte lub podstawowe. Użyj go jak "testx" .Left (4) lub str.Right (12);
źródło
MSDN
EDYCJA: zbyt wolno ...
źródło
jeśli nie jesteś pewien długości swojego ciągu, ale jesteś pewien liczby słów (w tym przypadku zawsze 2 słowa, np. „xxx yyyyyy”), lepiej użyj split.
to zawsze zwraca drugie słowo twojego ciągu.
źródło
Nie jest to dokładnie to, o co prosisz, ale patrząc na przykład, wydaje się, że szukasz numerycznej części ciągu.
Jeśli tak jest zawsze, dobrym sposobem na zrobienie tego byłoby użycie wyrażenia regularnego.
źródło
Użyj tego:
źródło
Zgaduję twoje wymagania, ale poniższe wyrażenie regularne zwróci tylko 6 znaków alfanumerycznych przed końcem ciągu i nie będzie pasować w innym przypadku.
źródło
Ponieważ używasz .NET, który kompiluje się do MSIL , po prostu odwołaj się do Microsoft.VisualBasic i użyj wbudowanej
Strings.Right
metody firmy Microsoft :Nie ma potrzeby tworzenia niestandardowej metody rozszerzenia ani innej pracy. Wynik uzyskuje się za pomocą jednego odniesienia i jednego prostego wiersza kodu.
Jako dalsze informacje na ten temat, użycie metod języka Visual Basic w języku C # zostało udokumentowane w innym miejscu . Osobiście natknąłem się na to pierwszy, próbując przeanalizować plik i stwierdziłem, że ten wątek SO dotyczący używania
Microsoft.VisualBasic.FileIO.TextFieldParser
klasy jest niezwykle przydatny do analizowania plików .csv.źródło
obsługuje to dowolną liczbę znaków w
str
. alternatywny kod nie obsługujenull
łańcucha. i pierwsza jest szybsza, a druga bardziej zwarta.wolę drugi, jeśli znam
str
zawierający krótki ciąg. jeśli jest to długi sznurek, bardziej odpowiedni jest pierwszy.na przykład
lub
źródło
Użyj tego:
string mystr = "PER 343573"; int number = Convert.ToInt32(mystr.Replace("PER ",""));
źródło
Kolejne rozwiązanie, o którym nie można wspomnieć
źródło
Metody zerowego bezpieczeństwa:
Ciągi krótsze niż maksymalna długość zwracająca oryginalny ciąg
Metoda rozszerzenia ciągów w prawo
Metoda przedłużenia ciągu z lewej strony
źródło
Oto rozwiązanie, którego używam ... Sprawdza, czy długość ciągu wejściowego nie jest mniejsza niż długość zadana. Powyższe rozwiązania, które widzę, niestety nie uwzględniają tego - co może prowadzić do awarii.
źródło
To jest metoda, której używam: lubię upraszczać.
źródło
Tylko myśl:
źródło
źródło
Bez uciekania się do konwertera bitów i przesuwania bitów (trzeba mieć pewność kodowania) jest to najszybsza metoda, której używam jako metoda rozszerzenia „Right”.
źródło
Array.Reverse
przyjmuje tablicę, a nie ciąg, iif (myString.length > 6)
. Pomijając błędy składniowe, dlaczego byłaby to najszybsza metoda? Z pewnością samo użycie podciągów byłoby lepszym sposobem, nie wymagałoby to całego kopiowania tablic.Używam Min, aby zapobiec negatywnym sytuacjom, a także obsługuję ciągi zerowe
źródło
wyjście to „Słowo”
źródło