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 :wink:
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
@NicTheQuick
Da gibt es noch einen Bug in der Linux Version mit UCase:
http://www.purebasic.fr/english/viewtop ... 24#p338224
http://www.purebasic.fr/english/viewtop ... 80#p360280

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. :mrgreen:

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.
ts-soft hat geschrieben:@NicTheQuick
Da gibt es noch einen Bug in der Linux Version mit UCase:
http://www.purebasic.fr/english/viewtop ... 24#p338224
http://www.purebasic.fr/english/viewtop ... 80#p360280
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 :wink:
Nur weil ich über das

Code: Alles auswählen

#Separator$ = " "
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.