pero el código de VB se basa en la función de subcadena c # en strings.sc
Our Man in Bananas
Esta no es realmente una buena manera de hacerlo, pero si está en apuros, puede agregar una referencia a Microsoft.VisualBasic.dll y usar el método Correcto. No es un método de extensión. Tienes que usarlo así:string endOfString = Strings.Right(wholeString, 6);
Este enfoque no funciona correctamente si la cadena no es tan larga como el número de caracteres requerido.
stevehipwell
1
Dependiendo de lo que quiera exactamente el OP, también se pueden lanzar expresiones regulares a esto. Si solo quiere el número al final de la cadena, esa es definitivamente la solución más sencilla, especialmente cuando el número de dígitos puede variar en alguna actualización de software posterior.
Joey
2
@Johannes Rössel - Soy un gran fanático de las expresiones regulares (vea mis respuestas), pero nunca las recomendaría para una situación simple como esta. Cualquiera de las respuestas que utilizan un contenedor de funciones se adapta mejor al mantenimiento del código que una expresión regular. Un método de extensión (o función estándar si .NET 2.0) es la mejor solución.
stevehipwell
@ Stevo3000: tener una solución que arroje si la cadena tiene la longitud incorrecta es una solución válida. No es la única solución, pero aún así.
Marc L.
3
@James - para ser igual de delicado, solo el título menciona "n letras". La pregunta real planteada pedía "las seis letras más a la derecha" :)
Chris Rogers
69
Escribe un método de extensión para expresar la Right(n);función. La función debe tratar con cadenas nulas o vacías que devuelven una cadena vacía, cadenas más cortas que la longitud máxima que devuelven la cadena original y cadenas más largas que la longitud máxima que devuelven la longitud máxima de los caracteres más a la derecha.
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;}
El índice de inicio tampoco puede ser menor que 0.
James
2
@James - ¡No será como sValue.Length > iMaxLengthantes de que se llame a una subcadena!
stevehipwell
3
Gran respuesta, pero fue un poco complicado ver la notación húngara en el código C #.
Jerad Rose
1
@JeradRose: trabajo en un proyecto en el que la base de código evolucionó a partir de una aplicación VB3 (la mayor parte es VB.NET), por lo que hay algunos restos.
stevehipwell
4
@Jalle, VB.NET tiene Left, Right y Mid como funciones de nivel superior, además de muchas otras cosas útiles que no forman parte de C #. No estoy seguro de por qué, ya que muchas de ellas son funciones decentes.
ingrediente_15939
40
Probablemente sea más agradable usar un método de extensión:
Entonces arrojaría una NullReferenceException tal como lo haría si intentara usar cualquier método en una cadena nula ...
James
1
str.Length - lengthpodría ser negativo. Además, el segundo parámetro es opcional. No es necesario pasar la longitud.
iheartcsharp
1
@ JMS10 ciertamente podría ser, pero eso es más la preocupación de las personas que llaman que la mía. Además, sí, es justo, podría usar la anulación que solo toma el parámetro único aquí.
si no está seguro de la longitud de su cadena, pero está seguro del recuento de palabras (siempre 2 palabras en este caso, como 'xxx yyyyyy'), será mejor que use split.
stringResult="PER 343573".Split(" ")[1];
esto siempre devuelve la segunda palabra de su cadena.
Sí; supongamos que el texto de OP SIEMPRE tiene espacios en blanco; como en su ejemplo :)
Christian
1
Hei Christian :) todos sabemos más de un par de líneas de respuesta. Acabo de responder a la pregunta brevemente, por supuesto, hay muchas más cosas a considerar en el código real.
Mahdi Tahsildari
7
Esto no es exactamente lo que está pidiendo, pero con solo mirar el ejemplo, parece que está buscando la sección numérica de la cadena.
Si este es siempre el caso, entonces una buena forma de hacerlo sería usando una expresión regular.
var regex=newRegex("\n+");string numberString = regex.Match(page).Value;
-1 Las expresiones regulares son un poco exageradas para algo como esto, especialmente cuando ya hay métodos integrados para hacerlo.
James
1
No estoy defendiendo el uso de este método si realmente solo necesita los últimos 6, pero si su objetivo es extraer un número (como una identificación) que puede cambiar a 5 o 7 dígitos en algún momento en el futuro, esto es una mejor manera.
chills42
1
Respuesta anterior, pero +1 para admitir el uso de expresiones regulares. Especialmente porque (todavía) no hay métodos integrados en la implementación de String de .NET para hacer esto @James. De lo contrario, es posible que esta pregunta nunca haya existido.
CrazyIvan 1974
@ CrazyIvan1974 no estoy seguro de por qué me has mencionado en tu comentario
James
5
Utilizar este:
String text ="PER 343573";String numbers = text;if(text.Length>6){
numbers = text.Substring(text.Length-6);}
Adivinando sus requisitos, pero la siguiente expresión regular arrojará solo 6 caracteres alfanuméricos antes del final de la cadena y ninguna coincidencia de lo contrario.
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);
No es necesario crear un método de extensión personalizado u otro trabajo. El resultado se logra con una referencia y una simple línea de código.
Como información adicional sobre esto, el uso de métodos de Visual Basic con C # se ha documentado en otra parte . Personalmente, me topé con él primero al intentar analizar un archivo, y encontré que este hilo SO sobre el uso de la Microsoft.VisualBasic.FileIO.TextFieldParserclase es extremadamente útil para analizar archivos .csv.
esto admite cualquier número de caracteres en el str. el código alternativo no admite nullcadena. y el primero es más rápido y el segundo es más compacto.
Prefiero el segundo si conozco la strcadena corta que contiene. si es una cuerda larga, la primera es más adecuada.
Aquí está la solución que uso ... Comprueba que la longitud de la cadena de entrada no sea menor que la longitud solicitada. Desafortunadamente, las soluciones que veo publicadas anteriormente no tienen esto en cuenta, lo que puede provocar fallas.
/// <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);}}
El código debe ir acompañado de una explicación escrita sobre cómo soluciona el problema en el OP.
Zze
1
Bueno, pensé que la explicación escrita en los comentarios era suficiente, ¿no?
vldmrrr
0
Sin recurrir al convertidor de bits y al cambio de bits (es necesario estar seguro de la codificación), este es el método más rápido que utilizo como método de extensión 'Derecha'.
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.Reversetoma una matriz, no una cadena, y if (myString.length > 6). Dejando a un lado los errores de sintaxis, ¿por qué sería este el método más rápido? Seguramente usar una subcadena sería una mejor manera, no requeriría toda esta copia de matrices.
1800 INFORMACIÓN
0
Utilizo Min para prevenir situaciones negativas y también manejo cadenas 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);
Respuestas:
fuente
Escribe un método de extensión para expresar la
Right(n);
función. La función debe tratar con cadenas nulas o vacías que devuelven una cadena vacía, cadenas más cortas que la longitud máxima que devuelven la cadena original y cadenas más largas que la longitud máxima que devuelven la longitud máxima de los caracteres más a la derecha.fuente
sValue.Length > iMaxLength
antes de que se llame a una subcadena!Probablemente sea más agradable usar un método de extensión:
Uso
fuente
str.Length - length
podría ser negativo. Además, el segundo parámetro es opcional. No es necesario pasar la longitud.No debe producirse un error, devuelve nulos como una cadena vacía, devuelve valores recortados o base. Úselo como "testx" .Left (4) o str.Right (12);
fuente
MSDN
EDITAR: demasiado lento ...
fuente
si no está seguro de la longitud de su cadena, pero está seguro del recuento de palabras (siempre 2 palabras en este caso, como 'xxx yyyyyy'), será mejor que use split.
esto siempre devuelve la segunda palabra de su cadena.
fuente
Esto no es exactamente lo que está pidiendo, pero con solo mirar el ejemplo, parece que está buscando la sección numérica de la cadena.
Si este es siempre el caso, entonces una buena forma de hacerlo sería usando una expresión regular.
fuente
Utilizar este:
fuente
Adivinando sus requisitos, pero la siguiente expresión regular arrojará solo 6 caracteres alfanuméricos antes del final de la cadena y ninguna coincidencia de lo contrario.
fuente
Dado que está utilizando .NET, que se compila en MSIL , solo haga referencia a Microsoft.VisualBasic y use el
Strings.Right
método integrado de Microsoft :No es necesario crear un método de extensión personalizado u otro trabajo. El resultado se logra con una referencia y una simple línea de código.
Como información adicional sobre esto, el uso de métodos de Visual Basic con C # se ha documentado en otra parte . Personalmente, me topé con él primero al intentar analizar un archivo, y encontré que este hilo SO sobre el uso de la
Microsoft.VisualBasic.FileIO.TextFieldParser
clase es extremadamente útil para analizar archivos .csv.fuente
esto admite cualquier número de caracteres en el
str
. el código alternativo no admitenull
cadena. y el primero es más rápido y el segundo es más compacto.Prefiero el segundo si conozco la
str
cadena corta que contiene. si es una cuerda larga, la primera es más adecuada.p.ej
o
fuente
Utilizar este:
string mystr = "PER 343573"; int number = Convert.ToInt32(mystr.Replace("PER ",""));
fuente
Otra solución que puede no mencionarse
fuente
Métodos seguros nulos:
Cadenas más cortas que la longitud máxima que devuelven la cadena original
Método de extensión de cadena a la derecha
Método de extensión de cadena a la izquierda
fuente
Aquí está la solución que uso ... Comprueba que la longitud de la cadena de entrada no sea menor que la longitud solicitada. Desafortunadamente, las soluciones que veo publicadas anteriormente no tienen esto en cuenta, lo que puede provocar fallas.
fuente
Este es el método que utilizo: me gusta simplificar las cosas.
fuente
Solo un pensamiento:
fuente
fuente
Sin recurrir al convertidor de bits y al cambio de bits (es necesario estar seguro de la codificación), este es el método más rápido que utilizo como método de extensión 'Derecha'.
fuente
Array.Reverse
toma una matriz, no una cadena, yif (myString.length > 6)
. Dejando a un lado los errores de sintaxis, ¿por qué sería este el método más rápido? Seguramente usar una subcadena sería una mejor manera, no requeriría toda esta copia de matrices.Utilizo Min para prevenir situaciones negativas y también manejo cadenas nulas
fuente
la salida es "Word"
fuente