но код VB основан на функции c # Substring в strings.sc
Наш человек в бананах
На самом деле это не очень хороший способ сделать это, но если вы в затруднении, вы можете добавить ссылку на Microsoft.VisualBasic.dll и использовать правильный метод. Это не метод расширения. Вы должны использовать его так:string endOfString = Strings.Right(wholeString, 6);
Этот подход не работает правильно, если длина строки меньше требуемого количества символов.
stevehipwell
1
В зависимости от того, что именно хочет OP, можно также использовать регулярные выражения. Если ему нужен только номер в конце строки, это определенно самое безболезненное решение, особенно когда количество цифр может измениться при более позднем обновлении программного обеспечения.
Joey
2
@Johannes Rössel - я большой поклонник регулярных выражений (см. Мои ответы), но я бы никогда не рекомендовал их для такой простой ситуации, как эта. Любой из ответов, в которых используется оболочка функции, лучше подходит для обслуживания кода, чем регулярное выражение. Метод расширения (или стандартная функция, если .NET 2.0) - лучшее решение.
stevehipwell
@ Stevo3000 - наличие решения, которое выдает, если строка имеет неправильную длину, является допустимым решением. Не единственное решение, но все же.
Марк Л.
3
@James - чтобы быть столь же назойливым, только в заголовке упоминается "n букв". Фактически заданный вопрос - это «шесть крайних правых букв» :)
Крис Роджерс
69
Напишите метод расширения для выражения Right(n);функции. Функция должна иметь дело с нулевыми или пустыми строками, возвращая пустую строку, строки короче максимальной длины, возвращающие исходную строку, и строки длиннее максимальной длины, возвращающие максимальную длину крайних правых символов.
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;}
@James - Это будет не так, как sValue.Length > iMaxLengthдо вызова подстроки!
stevehipwell
3
Отличный ответ, но увидеть венгерскую нотацию в коде C # было немного сложно.
Jerad Rose
1
@JeradRose - я работаю в проекте, где кодовая база выросла из приложения VB3 (большая часть этого - VB.NET), поэтому есть некоторые остатки.
Stevehipwell
4
@Jalle, VB.NET имеет Left, Right и Mid в качестве функций верхнего уровня, а также много других полезных вещей, которые не являются частью C #. Не уверен, почему, так как многие из них являются достойными функциями.
Тогда это вызовет исключение NullReferenceException, как если бы вы попытались использовать какой-либо метод для нулевой строки ...
Джеймс,
1
str.Length - lengthможет быть отрицательным. Также второй параметр не обязателен. Не нужно передавать длину.
iheartcsharp
1
@ JMS10, конечно, может быть, но это больше беспокоит вызывающих абонентов, чем меня. Кроме того, да, честно, вы можете использовать переопределение, которое просто принимает здесь единственный параметр.
Не должно ошибаться, возвращает нули как пустую строку, возвращает усеченные или базовые значения. Используйте его как "testx" .Left (4) или str.Right (12);
если вы не уверены в длине своей строки, но уверены в количестве слов (в данном случае всегда 2 слова, например, xxx yyyyyy), вам лучше использовать split.
Да; предположим, что в тексте OP ВСЕГДА есть пробелы; как в его примере :)
Кристиан
1
Привет, Кристиан :) мы все знаем больше, чем пару строчек ответа. Я просто кратко ответил на вопрос, конечно, в реальном коде нужно учитывать гораздо больше вещей.
Махди Тахсильдари
7
Это не совсем то, что вы просите, но просто глядя на пример, кажется, что вы ищете числовую часть строки.
Если это всегда так, то хороший способ сделать это - использовать регулярное выражение.
var regex=newRegex("\n+");string numberString = regex.Match(page).Value;
Регулярные выражения -1 - это немного излишне для чего-то вроде этого, особенно когда для этого уже есть встроенные методы.
Джеймс
1
Я не выступаю за использование этого метода, если вам действительно нужны только последние 6, но если ваша цель - извлечь число (например, идентификатор), которое в какой-то момент в будущем может измениться на 5 или 7 цифр, это это лучший способ.
chills42
1
Старый ответ, но +1 для поддержки использования регулярных выражений. Тем более, что (до сих пор) нет встроенных методов в реализации String .NET для этого @James. В противном случае этого вопроса, возможно, никогда не существовало.
CrazyIvan1974
@ CrazyIvan1974, не уверен, почему вы упомянули меня в своем комментарии
Джеймс
5
Использовать это:
String text ="PER 343573";String numbers = text;if(text.Length>6){
numbers = text.Substring(text.Length-6);}
Предполагая ваши требования, но следующее регулярное выражение даст только 6 буквенно-цифровых символов до конца строки и не совпадет в противном случае.
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);
Нет необходимости создавать собственный метод расширения или выполнять другую работу. Результат достигается с помощью одной ссылки и одной простой строки кода.
В качестве дополнительной информации по этому поводу использование методов Visual Basic с C # описано в другом месте . Я лично впервые наткнулся на это при попытке проанализировать файл и обнаружил, что этот поток SO при использовании Microsoft.VisualBasic.FileIO.TextFieldParserкласса чрезвычайно полезен для анализа файлов .csv.
Вот решение, которое я использую ... Он проверяет, что длина входной строки не меньше запрошенной длины. Приведенные выше решения, к сожалению, не учитывают это, что может привести к сбоям.
/// <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);}}
Код должен сопровождаться письменным объяснением того, как он устраняет проблему в OP.
Zze
1
Ну, я думал, что письменного объяснения в комментариях достаточно, не так ли?
vldmrrr
0
Не прибегая к преобразователю битов и сдвигу битов (необходимо быть уверенным в кодировании), это самый быстрый метод, который я использую как метод расширения «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.Reverseпринимает массив, а не строку, и if (myString.length > 6). Если не считать синтаксических ошибок, почему это самый быстрый метод? Конечно, лучше было бы просто использовать подстроку, это не потребовало бы всего этого копирования массивов.
ИНФОРМАЦИЯ 1800
0
Я использую Min для предотвращения негативных ситуаций, а также обрабатываю пустые строки
// <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);
Ответы:
источник
Напишите метод расширения для выражения
Right(n);
функции. Функция должна иметь дело с нулевыми или пустыми строками, возвращая пустую строку, строки короче максимальной длины, возвращающие исходную строку, и строки длиннее максимальной длины, возвращающие максимальную длину крайних правых символов.источник
sValue.Length > iMaxLength
до вызова подстроки!Наверное, лучше использовать метод расширения:
использование
источник
str.Length - length
может быть отрицательным. Также второй параметр не обязателен. Не нужно передавать длину.Не должно ошибаться, возвращает нули как пустую строку, возвращает усеченные или базовые значения. Используйте его как "testx" .Left (4) или str.Right (12);
источник
MSDN
РЕДАКТИРОВАТЬ: слишком медленно ...
источник
если вы не уверены в длине своей строки, но уверены в количестве слов (в данном случае всегда 2 слова, например, xxx yyyyyy), вам лучше использовать split.
это всегда возвращает второе слово вашей строки.
источник
Это не совсем то, что вы просите, но просто глядя на пример, кажется, что вы ищете числовую часть строки.
Если это всегда так, то хороший способ сделать это - использовать регулярное выражение.
источник
Использовать это:
источник
Предполагая ваши требования, но следующее регулярное выражение даст только 6 буквенно-цифровых символов до конца строки и не совпадет в противном случае.
источник
Поскольку вы используете .NET, который компилируется в MSIL , просто укажите Microsoft.VisualBasic и используйте встроенный
Strings.Right
метод Microsoft :Нет необходимости создавать собственный метод расширения или выполнять другую работу. Результат достигается с помощью одной ссылки и одной простой строки кода.
В качестве дополнительной информации по этому поводу использование методов Visual Basic с C # описано в другом месте . Я лично впервые наткнулся на это при попытке проанализировать файл и обнаружил, что этот поток SO при использовании
Microsoft.VisualBasic.FileIO.TextFieldParser
класса чрезвычайно полезен для анализа файлов .csv.источник
это поддерживает любое количество символов в
str
. альтернативный код не поддерживаетnull
строку. причем первый быстрее, а второй компактнее.Я предпочитаю второй, если знаю
str
содержащую короткую строку. если это длинная строка, более подходит первая.например
или
источник
Использовать это:
string mystr = "PER 343573"; int number = Convert.ToInt32(mystr.Replace("PER ",""));
источник
Другое решение, о котором нельзя упоминать
источник
Нулевые безопасные методы:
Строки короче максимальной длины, возвращая исходную строку
Метод расширения строки справа
Метод расширения строки слева
источник
Вот решение, которое я использую ... Он проверяет, что длина входной строки не меньше запрошенной длины. Приведенные выше решения, к сожалению, не учитывают это, что может привести к сбоям.
источник
Это метод, который я использую: мне нравится все упрощать.
источник
Просто мысль:
источник
источник
Не прибегая к преобразователю битов и сдвигу битов (необходимо быть уверенным в кодировании), это самый быстрый метод, который я использую как метод расширения «Right».
источник
Array.Reverse
принимает массив, а не строку, иif (myString.length > 6)
. Если не считать синтаксических ошибок, почему это самый быстрый метод? Конечно, лучше было бы просто использовать подстроку, это не потребовало бы всего этого копирования массивов.Я использую Min для предотвращения негативных ситуаций, а также обрабатываю пустые строки
источник
вывод "Word"
источник