2011-11-11 27 views
78

Tengo una cadena numérica como esta 2223,00. Me gustaría transformarlo a 2223. Esto es: sin la información después de el ",". Supongamos que solo habrá dos decimales después del ",".Eliminar los últimos caracteres de una cadena en C#. Una manera elegante?

lo hice:

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

¿Hay una solución más elegante? Tal vez usando otra función? -I no me gusta poner Números explícita

Respuesta

166

Usted puede simplemente utilizar la sobrecarga de eliminar esa toma un parámetro:

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

Sin embargo, si usted está tratando de evitar la codificación dura la longitud, puede utilizar:

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

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 ** bajo nivel ** de rendimiento, la diferencia es increíblemente insignificante. Si SABE que ',' siempre está en la posición -3, entonces la primera solución sigue siendo correcta, pero * la optimización prematura * es algo terrible en lo que perder el tiempo. –

+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 hacer un perfil, que hubo un perf. cuello de botella aquí. Ambas (y la mayoría de las otras respuestas) van a ser muy rápidas, lo suficientemente buenas para casi todos los propósitos. –

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

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

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

En este ejemplo, elijo cultural de todos pero podría usar el que quieras.

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

Editar: También puede usar Truncate para eliminar todo después del, o.

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

Bueno, obtengo el mismo número en este caso, con el ** coma ** en él. – Kani

+0

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

+0

Como en el ejemplo: ** dddd, dd **, donde ** d ** es un dígito. Los decimales son posteriores a **, ** en este caso. Estoy estandarizando algunos resultados, borrando **. ** y **, **, o usando **. ** en lugar de **, ** – Kani

14

Tal vez esto:

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

O incluso 'str.Split (", ") [0]' – BoltClock

+0

Creo que esta es la respuesta "más elegante", al menos hasta ahora. –

+1

¿qué piensas del @ ReedCopsey one? Creo que es muy bueno. – Kani

6

Esto devolverá a usted una cadena excluyendo todo después de la coma

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

Por supuesto, esto asume la cadena tiene en realidad una coma con decimales. El código anterior fallará si no lo hace. Desea hacer más comprobaciones:

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

Supongo que está trabajando con una cadena para comenzar. Idealmente, si se trabaja con un número para empezar, como un flotador o doble, sólo podía echarlo a un int, y luego hacer myInt.ToString() como:

myInt = (int)double.Parse(myString) 

Este analiza el doble uso de la cultura actual (aquí en EE. UU., usamos . para los puntos decimales). Sin embargo, esto nuevamente asume que su cadena de entrada puede ser analizada.

1

Usted puede usar TrimEnd. También es eficiente y se ve limpio.

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

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

+0

sí, de hecho, no funcionó aquí:/ – Kani

+0

@phoog tienes razón –

-2

Use lastIndexOf.Al igual que:

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

Uso:

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 por dos razones:

  1. que puede encadenar con subcadena. Example: f1.Substring(directorypathLength).SubstringFromEnd(1)
  2. Velocidad.
0

Intente lo siguiente. Se trabajó para mí:

str = str.Split(',').Last(); 
1

Usted podría utilizar LastIndexOf y Subcadena combinado 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 (','));

Cuestiones relacionadas