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-

Kani
fuente

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(','));
Reed Copsey
fuente
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();
km
fuente
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.

Christopher Currens
fuente
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")));
Patrick Desjardins
fuente
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.
Sebastian Axe
fuente
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 (','));

Nada hombre
fuente
0

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

"Name,".TrimEnd(',');
Abdul Munim
fuente
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
0

Intente lo siguiente. Funcionó para mí:

str = str.Split(',').Last();
Hamidreza Amini
fuente
-3

Utilice lastIndexOf. Me gusta:

string var = var.lastIndexOf(',');
shrey
fuente
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