Elimina los últimos caracteres de una cadena en C #. ¿Una forma elegante?


84

Tengo una cadena numérica como esta 2223,00. Me gustaría transformarlo en 2223. Esto es: sin la información después de " , ". Suponga que sólo habrá dos decimales después de " , ".

Yo hice:

str = str.Remove(str.Length - 3, 3);

¿Existe una solución más elegante? ¿Quizás usando otra función? -No me gusta poner números explícitos-

Respuestas:


173

En realidad, puede usar la sobrecarga Eliminar que toma un parámetro:

str = str.Remove(str.Length - 3);

Sin embargo, si está tratando de evitar codificar la longitud, puede usar:

str = str.Remove(str.IndexOf(','));

Recibí muchas buenas respuestas. Pero este es el que usaré, en términos de elegancia. Sin embargo, no sé, en nivel bajo , cuál es más eficiente. Entonces, ¡haz tu elección!
Kani

6
La segunda solución es mucho más fácil de leer, comprender y mantener, y en términos de rendimiento de bajo nivel , la diferencia es increíblemente insignificante. Si SABE que ,siempre está en la posición -3, entonces la primera solución todavía está bien, pero la optimización prematura es algo terrible en lo que perder el tiempo.
Scott Rippey

2
@Kani El primero es el más eficiente, pero estoy completamente de acuerdo con Scott. Siempre elegiría el segundo, a menos que supiera, después de perfilar, que había un perf. cuello de botella aquí. Ambos (y la mayoría de las otras respuestas) serán muy rápidos, lo suficientemente buenos para casi todos los propósitos.
Reed Copsey

Suponga que desea que la cadena no se modifique si no hay coma.
Kyle Delaney

15

Quizás esto:

str = str.Split(",").First();

Creo que esta es la "más elegante" de las respuestas, al menos hasta ahora.
Tom Bushell

1
¿Qué opinas del @ ReedCopsey? Creo que es muy bueno.
Kani

@Kani: en términos de elegancia, encuentro que la mayoría de las respuestas publicadas son suficientemente buenas . Tampoco me molestaría el rendimiento, a menos que realmente demuestre ser un cuello de botella. Lo único a considerar es cómo quiere lidiar con cadenas que vienen en diferentes formatos ...
km

Considere pasar un segundo argumento de 2a Splitporque no le importan más comas.
Richard

5

Esto le devolverá una cadena que excluye todo después de la coma

str = str.Substring(0, str.IndexOf(','));

Por supuesto, esto supone que su cadena en realidad tiene una coma con decimales. El código anterior fallará si no lo hace. Le gustaría hacer más comprobaciones:

commaPos = str.IndexOf(',');
if(commaPos != -1)
    str = str.Substring(0, commaPos)

Supongo que estás trabajando con una cadena para empezar. Idealmente, si está trabajando con un número para empezar, como un flotante o un doble, podría simplemente convertirlo en un int, luego haga lo siguiente myInt.ToString():

myInt = (int)double.Parse(myString)

Esto analiza el doble usando la cultura actual (aquí en los EE. UU., Usamos .para puntos decimales). Sin embargo, esto nuevamente supone que su cadena de entrada se puede analizar.


3
String.Format("{0:0}", 123.4567);      // "123"

Si su valor inicial es un decimal en una cadena, deberá convertir

String.Format("{0:0}", double.Parse("3.5", CultureInfo.InvariantCulture))  //3.5

En este ejemplo, elijo Cultura invariante, pero podría usar la que desee.

Prefiero usar la función de formato porque nunca se sabe si el decimal puede contener 2 o 3 números iniciales en el futuro.

Editar: también puede usar Truncatepara eliminar todo después de, o.

Console.WriteLine(Decimal.Truncate(Convert.ToDecimal("3,5")));

Bueno, obtengo el mismo número en este caso, con coma .
Kani

¿Cuál es la cadena exacta que usa y qué cultura es su computadora?
Patrick Desjardins

Como en el ejemplo: dddd, dd , donde d es un dígito. Los decimales están después de , en este caso. Estoy estandarizando algunos resultados, eliminando . y , o usando . en lugar de ,
Kani

No sé si usaría string.Format para hacer esto personalmente. Mientras funciona, termina encajonando el doble antes de pasar a string.Format, creando así un objeto extra.
Christopher Currens

Debo decir que no sé qué es mejor en términos de rendimiento entre jugar con String (subcadena) o boxear. No creo que realmente importe si no se usa de forma intensiva. Depende de la situación :)
Patrick Desjardins

1

Utilizar:

public static class StringExtensions
{
    /// <summary>
    /// Cut End. "12".SubstringFromEnd(1) -> "1"
    /// </summary>
    public static string SubstringFromEnd(this string value, int startindex)
    {
        if (string.IsNullOrEmpty(value)) return value;
        return value.Substring(0, value.Length - startindex);
    }
}

Prefiero un método de extensión aquí por dos razones:

  1. Puedo encadenarlo con Substring. Example: f1.Substring(directorypathLength).SubstringFromEnd(1)
  2. Velocidad.

1

Puede usar LastIndexOf y Substring combinados para obtener todos los caracteres a la izquierda del último índice de la coma dentro de la picadura.

cadena var = var.Substring (0, var.LastIndexOf (','));


0

Puede utilizar TrimEnd. También es eficiente y se ve limpio.

"Name,".TrimEnd(',');

4
Eso solo eliminará los caracteres ',' que estén al final de la cadena. Dado que la cadena "123,45" termina con dígitos, "123,45".TrimEnd(',')devolverá "123,45".
phoog

Remove last characters from a string if this character is... Me queda bien. Apreciado. "oppa/ ".Trim().TrimEnd('/');
it3xl


-3

Utilice lastIndexOf. Me gusta:

string var = var.lastIndexOf(',');

var es un nombre de variable. Nunca debe usarse como nombre de una cadena. -1; además, esto solo da el índice, por lo que solo resuelve parte del problema. Necesita Eliminar ().
Patrick Knott
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.