mas o código VB depende da função c # Substring em strings.sc
Our Man in Bananas
Essa não é uma maneira muito boa de fazer isso, mas se você estiver em apuros, pode adicionar uma referência a Microsoft.VisualBasic.dll e usar o método correto. Não é um método de extensão. Você deve usá-lo assim:string endOfString = Strings.Right(wholeString, 6);
Esta abordagem não funciona corretamente se a string não for tão longa quanto o número de caracteres necessários.
stevehipwell
1
Dependendo do que exatamente o OP deseja, pode-se também lançar expressões regulares nisso. Se ele quiser apenas o número no final da string, essa é definitivamente a solução mais fácil, especialmente quando o número de dígitos pode variar em alguma atualização de software posterior.
Joey
2
@Johannes Rössel - Sou um grande fã de expressões regulares (veja minhas respostas), mas nunca as recomendaria para uma situação simples como essa. Qualquer uma das respostas que usam um wrapper de função é mais adequada para manutenção de código do que uma expressão regular. Um método de extensão (ou função padrão se .NET 2.0) é a melhor solução.
stevehipwell
@ Stevo3000 - ter uma solução que lança se a string tiver o comprimento errado é uma solução válida. Não é a única solução, mas ainda assim.
Marc L.
3
@James - para ser tão perverso, apenas o título mencionava "n letras". A questão real colocada era "as seis letras mais à direita" :)
Chris Rogers
69
Escreva um método de extensão para expressar a Right(n);função. A função deve lidar com strings nulas ou vazias retornando uma string vazia, strings menores que o comprimento máximo retornando a string original e strings maiores que o comprimento máximo retornando o comprimento máximo dos caracteres mais à direita.
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 - Não será como sValue.Length > iMaxLengthantes de uma substring ser chamada!
stevehipwell
3
Ótima resposta, mas foi um pouco confuso ver a notação húngara no código C #.
Jerad Rose
1
@JeradRose - Eu trabalho em um projeto em que o código base evoluiu de um aplicativo VB3 (a maior parte dele é VB.NET), então há alguns resquícios.
stevehipwell
4
@Jalle, VB.NET tem Left, Right e Mid como funções de nível superior, além de muitas outras coisas úteis que não fazem parte do C #. Não sei por que, pois muitos deles são funções decentes.
Em seguida, ele lançaria uma NullReferenceException, exatamente como faria se você tentasse usar qualquer método em uma string nula ...
James
1
str.Length - lengthpode ser negativo. Além disso, o segundo parâmetro é opcional. Não há necessidade de passar o comprimento.
iheartcsharp
1
@ JMS10 certamente poderia ser, mas essa é mais a preocupação dos chamadores do que minha. Além disso, sim, justo ponto, você poderia usar a substituição que usa apenas o único parâmetro aqui.
se você não tem certeza do comprimento de sua string, mas tem certeza da contagem de palavras (sempre 2 palavras neste caso, como 'xxx yyyyyy'), é melhor usar dividir.
stringResult="PER 343573".Split(" ")[1];
isso sempre retorna a segunda palavra de sua string.
Sim; vamos apenas assumir que o texto de OP SEMPRE tem espaços em branco; como no exemplo dele :)
Christian
1
Hei Christian :) todos nós sabemos mais do que algumas linhas de uma resposta. Acabei de responder à pergunta resumidamente, é claro, há muito mais coisas a serem consideradas no código real.
Mahdi Tahsildari
7
Não é exatamente isso que você está pedindo, mas apenas olhando para o exemplo, parece que você está procurando a seção numérica da string.
Se esse for sempre o caso, uma boa maneira de fazer isso seria usar uma expressão regular.
var regex=newRegex("\n+");string numberString = regex.Match(page).Value;
-1 Expressões regulares são um pouco exageradas para algo assim, especialmente quando já existem métodos embutidos para fazer isso.
James
1
Não estou defendendo o uso desse método se você realmente precisar apenas dos últimos 6, mas se seu objetivo for extrair um número (como um id) que pode mudar para 5 ou 7 dígitos em algum momento no futuro, este é a melhor maneira.
chills42 de
1
Resposta antiga, mas +1 para apoiar o uso de expressões regulares. Especialmente porque (ainda) não há métodos embutidos na implementação de String do .NET para fazer isso @James. Caso contrário, esta questão pode nunca ter existido.
CrazyIvan1974
@ CrazyIvan1974 não tenho certeza por que você me mencionou em seu comentário
James
5
Usa isto:
String text ="PER 343573";String numbers = text;if(text.Length>6){
numbers = text.Substring(text.Length-6);}
Adivinhando seus requisitos, mas a seguinte expressão regular produzirá apenas 6 alfanuméricos antes do final da string e nenhuma correspondência de outra forma.
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);
Não há necessidade de criar um método de extensão personalizado ou outro trabalho. O resultado é alcançado com uma referência e uma linha simples de código.
Como mais informações sobre isso, o uso de métodos do Visual Basic com C # foi documentado em outro lugar . Eu pessoalmente tropecei nele primeiro ao tentar analisar um arquivo, e descobri que este tópico do SO sobre o uso da Microsoft.VisualBasic.FileIO.TextFieldParserclasse é extremamente útil para analisar arquivos .csv.
isso suporta qualquer número de caracteres no str. o código alternativo não suporta nullstring. e, o primeiro é mais rápido e o segundo é mais compacto.
Eu prefiro o segundo se conhecer a strstring curta. se for uma string longa, a primeira é mais adequada.
Aqui está a solução que eu uso ... Ele verifica se o comprimento da string de entrada não é menor do que o comprimento solicitado. As soluções que vejo postadas acima não levam isso em consideração, infelizmente - o que pode levar a travamentos.
/// <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);}}
O código deve ser acompanhado de uma explicação por escrito sobre como ele corrige o problema no OP.
Zze
1
Bem, eu pensei que uma explicação escrita nos comentários fosse suficiente, não?
vldmrrr
0
Sem recorrer ao conversor de bits e ao deslocamento de bits (é preciso ter certeza da codificação), este é o método mais rápido que uso como método de extensão 'Certo'.
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.Reverserecebe uma matriz, não uma string e if (myString.length > 6). Deixando de lado os erros de sintaxe, por que esse seria o método mais rápido? Certamente, apenas usar substring seria a melhor maneira, não exigiria toda essa cópia de arrays.
1800 INFORMAÇÕES
0
Eu uso o Min para prevenir as situações negativas e também lidar com strings nulas
// <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);
Respostas:
fonte
Escreva um método de extensão para expressar a
Right(n);
função. A função deve lidar com strings nulas ou vazias retornando uma string vazia, strings menores que o comprimento máximo retornando a string original e strings maiores que o comprimento máximo retornando o comprimento máximo dos caracteres mais à direita.fonte
sValue.Length > iMaxLength
antes de uma substring ser chamada!Provavelmente melhor usar um método de extensão:
Uso
fonte
str.Length - length
pode ser negativo. Além disso, o segundo parâmetro é opcional. Não há necessidade de passar o comprimento.Não deve dar erro, retorna nulos como string vazia, retorna valores aparados ou básicos. Use-o como "testx" .Left (4) ou str.Right (12);
fonte
MSDN
EDIT: muito lento ...
fonte
se você não tem certeza do comprimento de sua string, mas tem certeza da contagem de palavras (sempre 2 palavras neste caso, como 'xxx yyyyyy'), é melhor usar dividir.
isso sempre retorna a segunda palavra de sua string.
fonte
Não é exatamente isso que você está pedindo, mas apenas olhando para o exemplo, parece que você está procurando a seção numérica da string.
Se esse for sempre o caso, uma boa maneira de fazer isso seria usar uma expressão regular.
fonte
Usa isto:
fonte
Adivinhando seus requisitos, mas a seguinte expressão regular produzirá apenas 6 alfanuméricos antes do final da string e nenhuma correspondência de outra forma.
fonte
Como você está usando .NET, que é compilado em MSIL , basta fazer referência a Microsoft.VisualBasic e usar o
Strings.Right
método integrado da Microsoft :Não há necessidade de criar um método de extensão personalizado ou outro trabalho. O resultado é alcançado com uma referência e uma linha simples de código.
Como mais informações sobre isso, o uso de métodos do Visual Basic com C # foi documentado em outro lugar . Eu pessoalmente tropecei nele primeiro ao tentar analisar um arquivo, e descobri que este tópico do SO sobre o uso da
Microsoft.VisualBasic.FileIO.TextFieldParser
classe é extremamente útil para analisar arquivos .csv.fonte
isso suporta qualquer número de caracteres no
str
. o código alternativo não suportanull
string. e, o primeiro é mais rápido e o segundo é mais compacto.Eu prefiro o segundo se conhecer a
str
string curta. se for uma string longa, a primeira é mais adequada.por exemplo
ou
fonte
Usa isto:
string mystr = "PER 343573"; int number = Convert.ToInt32(mystr.Replace("PER ",""));
fonte
Outra solução que não pode ser mencionada
fonte
Métodos de segurança nulos:
Strings mais curtos que o comprimento máximo retornando a string original
Método de extensão da string direita
Método de extensão da string esquerda
fonte
Aqui está a solução que eu uso ... Ele verifica se o comprimento da string de entrada não é menor do que o comprimento solicitado. As soluções que vejo postadas acima não levam isso em consideração, infelizmente - o que pode levar a travamentos.
fonte
Este é o método que uso: gosto de manter as coisas simples.
fonte
Apenas um pensamento:
fonte
fonte
Sem recorrer ao conversor de bits e ao deslocamento de bits (é preciso ter certeza da codificação), este é o método mais rápido que uso como método de extensão 'Certo'.
fonte
Array.Reverse
recebe uma matriz, não uma string eif (myString.length > 6)
. Deixando de lado os erros de sintaxe, por que esse seria o método mais rápido? Certamente, apenas usar substring seria a melhor maneira, não exigiria toda essa cópia de arrays.Eu uso o Min para prevenir as situações negativas e também lidar com strings nulas
fonte
a saída é "Word"
fonte