Entfernen Sie die letzten Zeichen aus einer Zeichenfolge in C #. Ein eleganter Weg?

84

Ich habe eine solche numerische Zeichenfolge 2223,00. Ich würde es gerne umwandeln 2223. Dies ist: ohne die Informationen nach dem " , ". Angenommen, nach dem " , " werden nur zwei Dezimalstellen angezeigt . " .

Ich tat:

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

Gibt es eine elegantere Lösung? Vielleicht mit einer anderen Funktion? -Ich mag es nicht, explizite Zahlen zu setzen-

Kani
quelle

Antworten:

172

Sie können tatsächlich nur die Überladung entfernen verwenden, die einen Parameter akzeptiert:

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

Wenn Sie jedoch versuchen, eine harte Codierung der Länge zu vermeiden, können Sie Folgendes verwenden:

str = str.Remove(str.IndexOf(','));
Reed Copsey
quelle
Ich habe viele gute Antworten erhalten. Aber dieses ist das, was ich in Bezug auf Eleganz verwenden werde. Trotzdem weiß ich auf niedrigem Niveau nicht , welches effizienter ist. Treffen Sie also Ihre Wahl!
Kani
6
Die zweite Lösung ist viel einfacher zu lesen, zu verstehen und zu warten, und in Bezug auf die Leistung auf niedrigem Niveau ist der Unterschied unglaublich unbedeutend. Wenn Sie wissen, dass sich das ,immer auf Position -3 befindet, ist die erste Lösung immer noch in Ordnung, aber eine vorzeitige Optimierung ist eine schreckliche Sache, für die Sie Ihre Zeit verschwenden müssen.
Scott Rippey
2
@Kani Der erste ist der effizienteste - aber ich stimme Scott vollkommen zu. Ich würde immer die zweite wählen, es sei denn, ich wusste nach der Profilerstellung, dass es eine Perfektion gibt. Engpass hier. Beide (und die meisten anderen Antworten) werden für fast alle Zwecke sehr schnell genug sein.
Reed Copsey
Angenommen, Sie möchten, dass die Zeichenfolge nicht geändert wird, wenn kein Komma vorhanden ist.
Kyle Delaney
15

Vielleicht das:

str = str.Split(",").First();
km
quelle
Ich denke, dies ist die "eleganteste" Antwort - zumindest bisher.
Tom Bushell
1
Was denkst du über die @ ReedCopsey? Ich denke ist sehr gut.
Kani
@Kani: In Bezug auf Eleganz finde ich die meisten Antworten gut genug . Die Leistung würde mich auch nicht stören, es sei denn, es handelt sich wirklich um einen Engpass. Die einzige Sache, die Sie berücksichtigen sollten, ist, wie Sie mit Zeichenfolgen umgehen möchten, die in einem anderen Format vorliegen ...
km
Überlegen Sie, ob Sie ein zweites Argument von 2to übergeben möchten , Splitda Sie keine weiteren Kommas benötigen.
Richard
5

Dadurch erhalten Sie eine Zeichenfolge, die alles nach dem Komma ausschließt

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

Dies setzt natürlich voraus, dass Ihre Zeichenfolge tatsächlich ein Komma mit Dezimalstellen hat. Der obige Code schlägt fehl, wenn dies nicht der Fall ist. Sie möchten mehr Überprüfungen durchführen:

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

Ich gehe davon aus, dass Sie zunächst mit einer Zeichenfolge arbeiten. Wenn Sie zunächst mit einer Zahl wie einem Float oder Double arbeiten, können Sie diese im Idealfall einfach in eine umwandeln intund dann Folgendes tun myInt.ToString():

myInt = (int)double.Parse(myString)

Dies analysiert das Double unter Verwendung der aktuellen Kultur (hier in den USA verwenden wir .für Dezimalstellen). Dies setzt jedoch wiederum voraus, dass Ihre Eingabezeichenfolge analysiert werden kann.

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

Wenn Ihr Anfangswert eine Dezimalzahl in eine Zeichenfolge ist, müssen Sie konvertieren

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

In diesem Beispiel wähle ich die invariante Kultur, aber Sie können die gewünschte verwenden.

Ich bevorzuge die Verwendung der Formatierungsfunktion, da Sie nie wissen, ob die Dezimalstelle in Zukunft 2 oder 3 führende Zahlen enthalten kann.

Bearbeiten: Sie können auch verwenden Truncate, um alle nach dem, oder zu entfernen.

Console.WriteLine(Decimal.Truncate(Convert.ToDecimal("3,5")));
Patrick Desjardins
quelle
Nun, ich bekomme in diesem Fall die gleiche Nummer, mit dem Koma drauf.
Kani
Was ist die genaue Zeichenfolge, die Sie verwenden, und welche Kultur hat Ihr Computer?
Patrick Desjardins
Wie im Beispiel: dddd, dd , wobei d eine Ziffer ist. Die Dezimalzahlen sind nach dem , in diesem Fall. Ich standardisiere einige Ergebnisse und lösche sie . und , oder verwenden . statt ,
Kani
Ich weiß nicht, ob ich string.Format verwenden würde, um dies persönlich zu tun. Während es funktioniert, wird das Double gepackt, bevor es an string.Format übergeben wird, wodurch ein zusätzliches Objekt erstellt wird.
Christopher Currens
Ich muss sagen, dass ich nicht weiß, was in Bezug auf die Leistung zwischen dem Spielen mit String (Teilzeichenfolge) oder dem Boxen besser ist. Ich denke nicht, dass es wirklich wichtig ist, wenn es nicht intensiv genutzt wird. Abhängig von der Situation :)
Patrick Desjardins
1

Verwenden:

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

Ich bevorzuge hier aus zwei Gründen eine Erweiterungsmethode:

  1. Ich kann es mit Teilstring verketten. Example: f1.Substring(directorypathLength).SubstringFromEnd(1)
  2. Geschwindigkeit.
Sebastian Axe
quelle
1

Sie können LastIndexOf und Substring zusammen verwenden, um alle Zeichen links vom letzten Index des Kommas innerhalb des Stichs abzurufen.

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

Nothingman
quelle
0

Sie können verwenden TrimEnd. Es ist auch effizient und sieht sauber aus.

"Name,".TrimEnd(',');
Abdul Munim
quelle
4
Dadurch werden nur alle ',' Zeichen entfernt, die sich am Ende der Zeichenfolge befinden. Da die Zeichenfolge "123,45" mit Ziffern endet, "123,45".TrimEnd(',')wird "123,45" zurückgegeben.
Phoog
Remove last characters from a string if this character is... Passt einfach gut zu mir. Geschätzt. "oppa/ ".Trim().TrimEnd('/');
it3xl
0

Versuche Folgendes. Es hat bei mir funktioniert:

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

Verwenden Sie lastIndexOf. Mögen:

string var = var.lastIndexOf(',');
Shrey
quelle
var ist ein Variablenname. Es sollte niemals als Name für eine Zeichenfolge verwendet werden. -1; Außerdem gibt dies nur den Index an, sodass nur ein Teil des Problems gelöst wird. Sie benötigen das Remove ().
Patrick Knott