Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi BooleanToString und StringToBoolean (https://www.delphipraxis.net/72327-booleantostring-und-stringtoboolean.html)

Go2EITS 28. Jun 2006 17:03


BooleanToString und StringToBoolean
 
Hallo DP,

ich habe mal zur Diskussion zwei Routinen, die ich hier mal reinstelle.

Delphi-Quellcode:
//Boolean2String
Function B2S(B:Boolean):String;
begin
if B=True then Result:='TRUE' else Result:='FALSE'
end;

//StringToBoolean: S muss 'TRUE' oder 'FALSE' sein!
Function S2B(S:String):BOOLEAN;
begin
if STRUPPER(PCHAR(S))='TRUE' then Result:=TRUE else Result:=FALSE;
end;
Es wird hier ein Boolean übergeben; es wird ein entsprechender String zurückgegeben.
Function B2S(B:Boolean):String;

Hier wird ein String übergegen; man bekommt ein Boolean zurück.
Function S2B(S:String):BOOLEAN;

Gerade letzte Routine birgt Gefahren: Leerer String, nicht getrimmter String etc.

Wie würdet es Ihr es elegant und sicher lösen? Bin gespannt...

Go2EITS

mirage228 28. Jun 2006 17:07

Re: BooleanToString und StringToBoolean
 
Hi,

Ich verwende dafür gewöhnlich die Borland-Funktionen Delphi-Referenz durchsuchenStrToBool und Delphi-Referenz durchsuchenBoolToStr. Letztere hat auch noch ein paar Optionsmöglichkeiten, aber bei mir haben beide immer zuverlässig funktioniert.

mfG
mirage228

Neutral General 28. Jun 2006 17:08

Re: BooleanToString und StringToBoolean
 
Delphi-Quellcode:
function B2S(B: Boolean): String;
begin
 case B of
  true : Result := 'TRUE';
  false: Result := 'FALSE';
 end;
end;

fucntion S2B(S: String): Boolean;
begin
 Result := false; // falls mist übergeben wird dann false
 if UpperCase(S) = 'TRUE' then Result := true;
 if UpperCase(S) = 'FALSE' then Result := false;
end;
So ungefähr mach ich es immer. Die müssten eigentlich beide ohne Probleme funktionieren :gruebel:
EDIT: Obwohl man sich die zweite if-Zeile auch sparen kann...

Gruß
Neutral General

Valle 28. Jun 2006 17:09

Re: BooleanToString und StringToBoolean
 
Ich hätte es so gemacht:

Delphi-Quellcode:
Function S2B(S:String):BOOLEAN;
begin
if STRUPPER(PCHAR(S)) = 'TRUE' then
Result := TRUE
else if STRUPPER(PCHAR(S)) = 'FALSE' then
Result := FALSE else
{ Fehlerroutine }
end;
Aber warum erstellst du die Funktionen, die gibt's doch schon!?

pszopp 28. Jun 2006 17:10

Re: BooleanToString und StringToBoolean
 
Hallo,

B=True sollte man nicht schreiben.

Delphi-Quellcode:
if B then Result:='TRUE' else Result:='FALSE';
reicht völlig.

So würde ich die andere Funktion realisieren:
Delphi-Quellcode:
//StringToBoolean: S muss 'TRUE' oder 'FALSE' sein!
Function S2B(Const S:String):BOOLEAN;
begin
  Result := SameText('true', S);
end;

Viele Grüße,
pszopp

Muetze1 28. Jun 2006 17:15

Re: BooleanToString und StringToBoolean
 
Ok, ich will dann auch :

Delphi-Quellcode:
Function BoolToString(Const ABool: Boolean): String;
Const
  coBoolValues : Array[Boolean] of String = ( 'false', 'true' );
Begin
  Result := coBoolValues[ABool];
End;

Function StringToBool(Const AString: String): Boolean;
Begin
  Result := AnsiSameText(AString, 'true');
End;

negaH 28. Jun 2006 17:20

Re: BooleanToString und StringToBoolean
 
um Muetzes Vorschlag noch zusätzlich abzusichern dann so:

Delphi-Quellcode:
function BoolToString(const ABool: Boolean): String;
const
  coBoolValues : Array[Boolean] of String = ( 'false', 'true' );
begin
  Result := coBoolValues[ABool <> False];
end;
Ein Boolean ist ein Byte und manchesmal trifft man auf Programierer die per harten Cast Boolean := Boolean(3) benutzen. Das würde dann mit Muetzes Funktion eine AV beim Array Zugriff auslösen. Mit obiger Erweiterung macht man es Bulletproof.

Gruß Hagen

Go2EITS 28. Jun 2006 17:43

Re: BooleanToString und StringToBoolean
 
@mirage228 Uhiii peinlich, ich wusste nicht, dass es StrToBool und BoolToStr gibt. Ich hatte nach BooleanToString und StringToBoolean bzw. BooleanToStr und StrToString hier in der DP und Torry gesucht.

@Neutral General
Dein
Delphi-Quellcode:
function B2S(B: Boolean): String;
begin
case B of
  true : Result := 'TRUE';
  false: Result := 'FALSE';
end;
end;

fucntion S2B(S: String): Boolean;
begin
Result := false; // falls mist übergeben wird dann false
if UpperCase(S) = 'TRUE' then Result := true;
if UpperCase(S) = 'FALSE' then Result := false;
end;
gefällt mir sehr gut in Ergänzung mit @Vales Lösung der Fehlerbehandlung.

@pszopp, auch gut!

Alles super Lösungen, die ich sofort durchschaut habe.

Die Lösungen von Muetze1 und Hagen sind schon anspruchsvoller: Hier muss ich schon genau
schauen, wie es funktioniert. AnsiSametext und SameText sind mir neu, und vielleicht auch anderen Usern.

Und Hagen macht den Mutze1 Code noch fehlersicher.

Herzlichen Dank an Euch. Ich habe heute viel dazugelernt!!!!

Cu! :corky:
Go2EITS


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:32 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz