ProperCase in Strings

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
MikeLGS
Beiträge: 3
Registriert: 18.05.2012 13:42

ProperCase in Strings

Beitrag 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")

Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8812
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: ProperCase in Strings

Beitrag 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")
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: ProperCase in Strings

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
7x7
Beiträge: 591
Registriert: 14.08.2007 15:41
Computerausstattung: ganz toll
Wohnort: Lelbach

Re: ProperCase in Strings

Beitrag 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
- alles was ich hier im Forum sage/schreibe ist lediglich meine Meinung und keine Tatsachenbehauptung
- unkommentierter Quellcode = unqualifizierter Müll
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: ProperCase in Strings

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8812
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: ProperCase in Strings

Beitrag 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?
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: ProperCase in Strings

Beitrag 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
Zuletzt geändert von Nino am 18.05.2012 15:23, insgesamt 1-mal geändert.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: ProperCase in Strings

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: ProperCase in Strings

Beitrag von Nino »

Ja, danke! Hab's eben oben geändert.

Grüße, Nino
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8812
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: ProperCase in Strings

Beitrag von NicTheQuick »

Der einzige zugegebenermaßen vernachlässigbare Nachteil des Codes ist jetzt, dass Leerzeichen am Ende des Eingangsstrings abgeschnitten werden.
Antworten