Seite 1 von 3
ProperCase in Strings
Verfasst: 18.05.2012 13:50
von MikeLGS
Hi,
hier mal ein Code für die Funktion vbProperCase in PureBasic geschrieben. Nur sind hier die Funktionen von PureBasic benutzt worden und es funzt auch mit Umlauten. Die Prozedure aus dem englischem Forum ist da etwas eingeschränkt.
LG Mike
Code: Alles auswählen
Procedure.s ProperCase(text$)
For a = 1 To CountString(text$," ")+1
d$ = StringField(text$,a," ")
b$ = b$ + Left(UCase(d$),1)+Right(d$,Len(d$)-1) + Space(1)
a$ = RTrim(b$)
Next
ProcedureReturn a$
EndProcedure
Debug ProperCase("äpfel birnen kirschen")
Re: ProperCase in Strings
Verfasst: 18.05.2012 14:00
von NicTheQuick
Also bei mit funktioniert das mit den Umlauten trotzdem nicht. Dennoch hier eine wahrscheinlich schnellere Lösung:
Code: Alles auswählen
Procedure.s ProperCase(text.s)
Protected *c.Character = @text
*c\c = Asc(UCase(Chr(*c\c)))
While *c\c
If *c\c = ' '
*c + SizeOf(Character)
If *c\c
*c\c = Asc(UCase(Chr(*c\c)))
EndIf
Else
*c + SizeOf(Character)
EndIf
Wend
ProcedureReturn text
EndProcedure
Debug ProperCase("äpfel birnen kirschen")
Re: ProperCase in Strings
Verfasst: 18.05.2012 14:01
von ts-soft
Ein Beschreibung, was der Code macht wäre wohl angebracht
Erzeugt also eine Großschreibung aller Wörter.
Hab Deinen Code mal etwas modifiziert, weil Code ohne Variablendeklaration ist eine Fehlerquelle und keine Hilfe.
Des weiteren reicht es, wenn die Anzahl der Worte einmal ermittelt wird und auch das Trim ist nur einmal erforderlich.
Code: Alles auswählen
EnableExplicit
Procedure.s ProperCase(text$)
Protected a, count = CountString(text$," ") + 1
Protected d$, b$
For a = 1 To count
d$ = StringField(text$, a, " ")
b$ + Left(UCase(d$), 1) + Right(d$, Len(d$) -1) + Space(1)
Next
ProcedureReturn Trim(b$)
EndProcedure
Debug ProperCase("äpfel birnen kirschen")
/edit
Hier noch der link zum Beitrag im engl. Forum, ich denke mal, das Du den meinst:
http://www.purebasic.fr/english/viewtop ... 165#p52165
Re: ProperCase in Strings
Verfasst: 18.05.2012 14:15
von 7x7
NicTheQuick hat geschrieben:...hier eine wahrscheinlich schnellere Lösung:
Kann ja sein, dass es schneller ist, schaut aber generell furchtbar aus dieses Pointer-Gedöns
Re: ProperCase in Strings
Verfasst: 18.05.2012 14:29
von ts-soft
Re: ProperCase in Strings
Verfasst: 18.05.2012 14:53
von NicTheQuick
7x7 hat geschrieben:NicTheQuick hat geschrieben:...hier eine wahrscheinlich schnellere Lösung:
Kann ja sein, dass es schneller ist, schaut aber generell furchtbar aus dieses Pointer-Gedöns
Das ist leider meistens so, dass schnellerer Code furchtbar aussieht.
Hier im Forum tut Pointergedöhns jedenfalls keinen Abbruch. Der, den es interessiert, schaut es sich an und lernt vielleicht hinzu. Alle anderen nutzen die Funktion einfach oder nehmen die, die sie am verständlichsten finden.
Der Bug existiert also schon 'ne ganze Weile der Meldung nach zu urteilen. Wieso wird sowas nicht mal eben in 5 Minuten gefixt?
Re: ProperCase in Strings
Verfasst: 18.05.2012 15:10
von Nino
ts-soft hat geschrieben:Hab Deinen Code mal etwas modifiziert, weil Code ohne Variablendeklaration ist eine Fehlerquelle und keine Hilfe.
Des weiteren reicht es, wenn die Anzahl der Worte einmal ermittelt wird und auch das Trim ist nur einmal erforderlich.
Recht hast Du. Und da dies hier die "Tipps & Tricks"-Abteilung ist, würde ich noch einige Kleinigkeiten ändern, um mitlesende
Anfänger nicht auf die Idee zu brigen, sich schlechte Programmier-Angewohnheiten zuzulegen.
Code: Alles auswählen
b$ + Left(UCase(d$), 1) + Right(d$, Len(d$) -1) + Space(1)
Man braucht nicht erst einen kompletten String in Großbuchstaben umzuwandeln, wenn man dann nur das erste Zeichen davon benötigt. Besser: Erst das eine Zeichen abschneiden, und dann nur dieses umwandeln. Statt
Right(d$, Len(d$) -1) schreibt man besser
Mid(d$, 2), und statt 2x " " und 1x Space(1) würde ich eine entspr. Konstante benutzen. Halbwegs sinnvolle Variablennamen sind auch nicht schlecht:
Code: Alles auswählen
EnableExplicit
#Separator$ = " " ; Hier gehört die Konstante hin ...
Procedure.s ProperCase(text$)
; #Separator$ = " " ; ... nicht hierher.
Protected i, count = CountString(text$, #Separator$) + 1
Protected word$, result$ = ""
For i = 1 To count
word$ = StringField(text$, i, #Separator$)
result$ + UCase(Left(word$, 1)) + Mid(word$, 2) + #Separator$
Next
ProcedureReturn RTrim(result$)
EndProcedure
Debug "'" + ProperCase("äpfel birnen kirschen") + "'"
Grüße, Nino
Re: ProperCase in Strings
Verfasst: 18.05.2012 15:19
von ts-soft
Nino hat geschrieben:nicht auf die Idee zu brigen, sich schlechte Programmier-Angewohnheiten zuzulegen.

Dann noch ein kleiner Hinweis: Konstanten, genauso wie Strukturen oder Prototypes, sollte man nicht in einer
Procedure deklarieren! Diese sind niemals Lokal und gehören in den globalen Scope, möglichst am Anfang des Codes
Nur weil ich über das
gestolpert bin.
Gruß
Thomas
Re: ProperCase in Strings
Verfasst: 18.05.2012 15:24
von Nino
Ja, danke! Hab's eben oben geändert.
Grüße, Nino
Re: ProperCase in Strings
Verfasst: 18.05.2012 15:56
von NicTheQuick
Der einzige zugegebenermaßen vernachlässigbare Nachteil des Codes ist jetzt, dass Leerzeichen am Ende des Eingangsstrings abgeschnitten werden.