535 Stimmen

Wie kann ich eine .NET-Zeichenkette abschneiden?

Ich möchte eine Zeichenkette so abschneiden, dass sie nicht länger als ein bestimmter Wert ist. Ich schreibe in eine Datenbanktabelle und möchte sicherstellen, dass die Werte, die ich schreibe, die Einschränkung des Datentyps der Spalte erfüllen.

Es wäre zum Beispiel schön, wenn ich Folgendes schreiben könnte:

string NormalizeLength(string value, int maxLength)
{
    return value.Substring(0, maxLength);
}

Leider führt dies zu einer Ausnahme, da maxLength im Allgemeinen die Grenzen der Zeichenfolge überschreitet value . Natürlich könnte ich eine Funktion wie die folgende schreiben, aber ich hatte gehofft, dass so etwas bereits existiert.

string NormalizeLength(string value, int maxLength)
{
    return value.Length <= maxLength ? value : value.Substring(0, maxLength);
} 

Wo ist die schwer fassbare API, die diese Aufgabe erfüllt? Gibt es eine?

31 Stimmen

Für das Protokoll, Strings sind unveränderlich Sie können nicht truncate Sie können nur eine abgeschnittene Kopie von ihnen zurück. Ich weiß, das ist pingelig.

3 Stimmen

@John Weldon: Das ist wahrscheinlich der Grund, warum die Memberfunktion nicht existiert - sie folgt nicht der Semantik des Datentyps. Eine kleine Anmerkung am Rande, StringBuilder können Sie durch Verkürzung der Länge abschneiden, aber Sie müssen immer noch die Längenprüfung durchführen, um eine Verbreiterung der Zeichenkette zu vermeiden.

1 Stimmen

Unabhängig davon, für welche Lösung Sie sich entscheiden, sollten Sie vor dem Aufruf von Substring oder dem Zugriff auf die Length-Eigenschaft eine Prüfung auf eine Null-Zeichenkette hinzufügen.

1voto

Ray Punkte 21047

Es gibt nichts in .net für diese, dass ich bewusst bin - hier ist meine Version, die "..." hinzufügt:

public static string truncateString(string originalString, int length) {
  if (string.IsNullOrEmpty(originalString)) {
   return originalString;
  }
  if (originalString.Length > length) {
   return originalString.Substring(0, length) + "...";
  }
  else {
   return originalString;
  }
}

2 Stimmen

Ihre Version gibt Zeichenketten aus, die 3 Zeichen länger sind als die geforderte Länge, für den Fall, dass sie abgeschnitten werden. Außerdem sind die dreifachen Punkte wirklich nur in der Darstellung sinnvoll, ich würde es nicht in einer Datenbank speichern, wie das ist der Anwendungsfall, dass der OP gab.

1voto

Paul Haan Punkte 91

Ich weiß, dass es bereits eine Menge Antworten gibt, aber ich wollte den Anfang und das Ende der Zeichenkette intakt lassen, sie aber auf eine Länge unter der Höchstgrenze kürzen.

    public static string TruncateMiddle(string source)
    {
        if (String.IsNullOrWhiteSpace(source) || source.Length < 260) 
            return source;

        return string.Format("{0}...{1}", 
            source.Substring(0, 235),
            source.Substring(source.Length - 20));
    }

Damit können Sie SharePoint-URLs mit einer maximalen Länge von 260 Zeichen erstellen.

Ich habe length nicht zu einem Parameter gemacht, da es eine Konstante 260 ist. Ich habe auch die Länge der ersten Teilzeichenkette nicht zu einem Parameter gemacht, weil ich möchte, dass sie an einem bestimmten Punkt unterbrochen wird. Schließlich ist die zweite Teilzeichenkette die Länge der Quelle - 20, da ich die Ordnerstruktur kenne.

Dies kann leicht an Ihre spezifischen Bedürfnisse angepasst werden.

1voto

Jeroen Bom Punkte 41

Hier ist eine vb.net-Lösung, markieren Sie, dass die if (obwohl hässlich) Anweisung die Leistung verbessert, weil wir nicht die substring-Anweisung benötigen, wenn String bereits kleiner als maxlength ist... Indem man es zu einer Erweiterung von string macht, ist es einfach zu benutzen...

 <System.Runtime.CompilerServices.Extension()> _
    Public Function Truncate(String__1 As String, maxlength As Integer) As String
        If Not String.IsNullOrEmpty(String__1) AndAlso String__1.Length > maxlength Then
            Return String__1.Substring(0, maxlength)
        Else
            Return String__1
        End If
    End Function

0 Stimmen

In VB.net können Sie "Not String.IsNullOrEmpty(String__1)" durch "String__1 <> Nothing" ersetzen. Das ist ein bisschen kürzer. Der Standardwert für Strings ist ein leerer String. Mit "<> Nichts" werden sowohl Null als auch die leere Zeichenkette geprüft. Probieren Sie es aus mit: Truncate("", 50) und Truncate(Nothing, 50)

0 Stimmen

In VB können Sie Left(string, maxlength) verwenden

1voto

deegee Punkte 1463

Ich bevorzuge die Antwort von jpierson, aber keines der Beispiele, die ich hier sehe, behandelt einen ungültigen maxLength-Parameter, beispielsweise wenn maxLength < 0 ist.

Die Möglichkeiten wären entweder den Fehler in einem Try/Catch zu behandeln, den maxLength-Parameter min auf 0 zu setzen oder, wenn maxLength kleiner als 0 ist, einen leeren String zurückzugeben.

Nicht optimierter Code:

public string Truncate(this string value, int maximumLength)
{
    if (string.IsNullOrEmpty(value) == true) { return value; }
    if (maximumLen < 0) { return String.Empty; }
    if (value.Length > maximumLength) { return value.Substring(0, maximumLength); }
    return value;
}

3 Stimmen

Beachten Sie, dass ich in meiner Implementierung den Fall, in dem maximumLength kleiner als 0 ist, nicht behandelt habe, weil ich dachte, dass das Einzige, was ich tun würde, eine ArgumentOutOfRangeExcpetion wäre, was im Wesentlichen das ist, was string.Substring() für mich tut.

0voto

Als Ergänzung zu den oben diskutierten Möglichkeiten möchte ich meine Lösung mit Ihnen teilen. Es handelt sich um eine Erweiterungsmethode, die Null zulässt (gibt string.Empty zurück), und es gibt ein zweites .Truncate() für die Verwendung mit einer Ellipse. Aber Vorsicht, es ist nicht leistungsoptimiert.

public static string Truncate(this string value, int maxLength) =>
    (value ?? string.Empty).Substring(0, (value?.Length ?? 0) <= (maxLength < 0 ? 0 : maxLength) ? (value?.Length ?? 0) : (maxLength < 0 ? 0 : maxLength));
public static string Truncate(this string value, int maxLength, string ellipsis) =>
    string.Concat(value.Truncate(maxLength - (((value?.Length ?? 0) > maxLength ? ellipsis : null)?.Length ?? 0)), ((value?.Length ?? 0) > maxLength ? ellipsis : null)).Truncate(maxLength);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X