In der naiven ASCII-Welt:
%Vor%würde tun. Wenn es vorzuziehen ist, Speicher mit der ursprünglichen Zeichenfolge zu teilen und das Kopieren von SubString zu vermeiden, kann Folgendes verwendet werden:
%Vor%Aber in einer Unicode-Welt (und es ist eine Unicode-Welt) ist das besser:
%Vor%Schließlich erinnerte @ IsmaelVenegasCastelló uns an die Komplexität der Grapheme (arrrgh), und dann ist das, was benötigt wird:
%Vor% Diese letzten beiden Implementierungen versuchen, die Berechnung von length
(die langsam sein kann) oder das Zuweisen / Kopieren oder sogar das looping von n
-Zeiten, wenn length
kürzer ist, zu vermeiden.
Diese Antwort basiert auf Beiträgen von @MichaelOhlrogge, @FengyangWang, @Oxinabox und @ IsmaelVenegasCastelló
Ich würde strtruncate(str, n) = join(take(str, n))
machen.
Beispiel:
%Vor%Beachten Sie, dass Ihr Code für Unicode-Zeichenfolgen nicht vollständig gültig ist.
Wenn die Zeichenfolge ASCII ist, ist das ziemlich effizient:
%Vor%Oder an Ort und Stelle:
%Vor% Für Unicode ist @Fengyang Wangs Methode sehr schnell, aber die Konvertierung in ein Char
-Array kann etwas schneller sein, wenn Sie nur das Ende der Zeichenkette abschneiden:
Timing:
%Vor% Bearbeiten: Hoppla. Ich habe gerade gemerkt, dass ich die ursprüngliche Zeichenkette in trunc5
zerstöre. Dies sollte korrekt sein, aber mit weniger überlegener Leistung:
Neue Zeiten:
%Vor%Aaand new edit: Aargh, habe die Timing-Funktion vergessen. Ich gebe eine ASCII-Zeichenfolge ein:
%Vor% Letzte Änderung (hoffe ich):
Probiere @Dan Getz's truncate_grapheme
aus und benutze Unicode-Strings:
Timing:
%Vor%So scheint der letzte eindeutig der beste (und dieser Beitrag ist jetzt viel zu lang.)
Sie könnten die Funktion graphemes
verwenden:
Überprüfen Sie die Funktion truncate
:
So könnte die Lösung so aussehen:
%Vor%Teste es:
%Vor%Profil es:
%Vor%Tags und Links string julia-lang