Rimuove gli ultimi caratteri da una stringa in C #. Un modo elegante?


84

Ho una stringa numerica come questa 2223,00. Vorrei trasformarlo in 2223. Questo è: senza le informazioni dopo " , ". Supponiamo che ci saranno solo due decimali dopo " , ".

L'ho fatto:

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

C'è una soluzione più elegante? Forse usando un'altra funzione? -Non mi piace mettere numeri espliciti-

Risposte:


173

In realtà puoi semplicemente usare l'overload Rimuovi che accetta un parametro:

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

Tuttavia, se stai cercando di evitare l'hard coding della lunghezza, puoi usare:

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

Ho ricevuto molte buone risposte. Ma questo è quello che userò, in termini di eleganza. Tuttavia, non so, a livello basso , quale sia più efficiente. Quindi, fai la tua scelta!
Kani

6
La seconda soluzione è molto più facile da leggere, capire e mantenere e, in termini di prestazioni di basso livello , la differenza è incredibilmente insignificante. Se SAPETE che ,è sempre in posizione -3, allora la prima soluzione è ancora OK, ma l'ottimizzazione prematura è una cosa terribile su cui perdere tempo.
Scott Rippey

2
@Kani Il primo è il più efficiente, ma sono completamente d'accordo con Scott. Sceglierei sempre il secondo, a meno che non sapessi, dopo aver profilato, che c'era una perf. collo di bottiglia qui. Entrambe queste (e la maggior parte delle altre risposte) saranno abbastanza veloci, abbastanza buone per quasi tutti gli scopi.
Reed Copsey

Supponi di volere che la stringa non venga modificata se non c'è una virgola?
Kyle Delaney

15

Forse questo:

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

Penso che questa sia la "più elegante" delle risposte - almeno finora.
Tom Bushell

1
cosa ne pensi di @ ReedCopsey? Penso che sia molto buono.
Kani

@Kani: in termini di eleganza trovo che la maggior parte delle risposte postate sia abbastanza buona . Non mi preoccuperei nemmeno delle prestazioni, a meno che non si dimostrino davvero un collo di bottiglia. L'unica cosa da considerare è come vuoi gestire le stringhe che arrivano in formato diverso ...
km

Considera l'idea di passare un secondo argomento 2a Splitperché non ti interessano altre virgole.
Richard

5

Questo ti restituirà una stringa che esclude tutto ciò che è dopo la virgola

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

Ovviamente, questo presuppone che la tua stringa abbia effettivamente una virgola con decimali. Il codice precedente fallirà se non lo fa. Vorresti fare più controlli:

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

Immagino che tu stia lavorando con una stringa per cominciare. Idealmente, se stai lavorando con un numero per cominciare, come un float o un double, potresti semplicemente lanciarlo su un int, quindi fare myInt.ToString()come:

myInt = (int)double.Parse(myString)

Questo analizza il double usando la cultura corrente (qui negli Stati Uniti, usiamo .per i punti decimali). Tuttavia, anche in questo caso si presume che la stringa di input possa essere analizzata.


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

Se il tuo valore iniziale è un decimale in una stringa, dovrai convertirlo

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

In questo esempio, scelgo la cultura invariante ma potresti usare quella che desideri.

Preferisco usare la funzione di formattazione perché non sai mai se il decimale può contenere 2 o 3 numeri iniziali in futuro.

Modifica: puoi anche utilizzare Truncateper rimuovere tutto dopo, o.

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

Bene, in questo caso ottengo lo stesso numero, con il coma sopra.
Kani

Qual è la stringa esatta che usi e di che cultura è il tuo computer?
Patrick Desjardins

Come nell'esempio: dddd, dd , dove d è una cifra. I decimali sono dopo il , in questo caso. Sto standardizzando alcuni risultati, eliminando . e , o utilizzando . invece di ,
Kani

Non so se userei string.Format per farlo personalmente. Mentre funziona, finisce per inscatolare il double prima di passare a string.Format, creando così un oggetto extra.
Christopher Currens

Devo dire che non so cosa sia meglio in termini di prestazioni tra giocare con String (sottostringa) o boxe. Non credo che importi davvero se non viene utilizzato in modo intensivo. Dipende dalla situazione :)
Patrick Desjardins

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);
    }
}

Preferisco un metodo di estensione qui per due motivi:

  1. Posso concatenarlo con Substring. Example: f1.Substring(directorypathLength).SubstringFromEnd(1)
  2. Velocità.

1

È possibile utilizzare LastIndexOf e Substring combinati per ottenere tutti i caratteri a sinistra dell'ultimo indice della virgola all'interno del punto.

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


0

Puoi usare TrimEnd. È anche efficiente e sembra pulito.

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

4
Ciò rimuoverà solo i caratteri "," che si trovano alla fine della stringa. Poiché la stringa "123,45" termina con cifre, "123,45".TrimEnd(',')restituirà "123,45".
phoog

Remove last characters from a string if this character is... Mi sta bene. Apprezzato. "oppa/ ".Trim().TrimEnd('/');
it3xl


-3

Usa lastIndexOf. Piace:

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

var è un nome di variabile. Non dovrebbe mai essere usato come nome per una stringa. -1; inoltre questo fornisce solo l'indice, quindi risolve solo una parte del problema. Hai bisogno di Rimuovi ().
Patrick Knott
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.