web-dev-qa-db-fra.com

Existe-t-il un moyen plus simple d'effectuer des conversions booléennes?

J'ai utilisé ce scénario plusieurs fois dans presque tous mes projets, quand je fais une sorte de conversion de données, quand il s'agit de booléens, je me perds un peu quand il s'agit de simplifier les choses. Cette déclaration ci-dessous ressort comme un pouce endolori partout dans mon code:

if BoolVal then
  StrVal:= 'True'
else
  StrVal:= 'False';

Je me demande s'il existe un moyen plus simple d'effectuer cette évaluation? Peut-être une utilisation de l'instruction Case que je ne connais pas? Mon implémentation actuelle est plus complexe que juste StrVal mais elle consiste à renvoyer deux valeurs différentes selon qu'elle est True ou False. Par exemple, voici du vrai code ...

if fsBold in Can.Font.Style then
  ConvertTo(AddSomeOtherText + 'True')
else
  ConvertTo(AddSomeOtherText + 'False');

C'est juste pour souligner la simplicité que j'espère. Je me demande si je peux faire quelque chose du genre:

ConvertTo(AddSomeOtherText + BoolToStrCase((fsBold in Can.Font.Style), 'True', 'False'));

Je suis sûr que ce n'est pas une vraie commande, mais je recherche ce type de simplicité en une seule ligne.

21
Jerry Dodge

Dans l'unité StrUtils, il y a ifthen ()

StrVal := IfThen(BoolVal,'True','False');

Et pour ce cas précis, vous pouvez même utiliser:

StrVal := BoolToStr(BoolVal);
41

Personne n'a jamais entendu parler d'un tableau indexé par booléen?

const
  BOOL_TEXT: array[boolean] of string = ('False', 'True');
  YES_NO_TEXT: array[boolean] of string = ('No', 'Yes');
  ERROR_OR_WARNING_TEXT: array[boolean] of string = ('Warning', 'Error');

C'est en fait ce que BoolToStr utilise lui-même!

function BoolToStr(B: Boolean; UseBoolStrs: Boolean = False): string;
const
  cSimpleBoolStrs: array [boolean] of String = ('0', '-1');
24
Marjan Venema

Pour convertir un booléen en chaîne, il y a BoolToStr , qui existe depuis au moins Delphi 2007. Vous pouvez l'utiliser dans votre dernier exemple comme ceci:

TextVal := BoolToStr((fsBold in Can.Font.Style), True);

Pour aller dans l'autre sens (chaîne en booléen), vous devez exécuter une fonction réelle. Quelque chose comme ça devrait vous aider à démarrer:

function StringToBoolean(const Value: string): Boolean;
var
  TempStr: string;
begin
  TempStr := UpperCase(Value);
  Result := (TempStr = 'T') or 
            (TempStr = `TRUE`) or 
            (TempStr = 'Y');
end;

BoolVal := StringToBoolean('True');     // True
BoolVal := StringToBoolean('False');    // False
BoolVal := StringToBoolean('tRuE');     // True

Bien sûr, cela ne fonctionne pas s'il y a un non-sens dans Value, mais ...

7
Ken White

Essayez l'un ou l'autre. Les deux sont bien plus rapides que les versions par défaut.

type
 TBooleanWordType = (bwTrue, bwYes, bwOn, bwEnabled, bwSuccessful, bwOK, bwBinary);

 BooleanWord: array [Boolean, TBooleanWordType] of String =
  (
    ('False', 'No',  'Off', 'Disabled', 'Failed',     'Cancel', '0'),
    ('True',  'Yes', 'On',  'Enabled',  'Successful', 'Ok',     '1')
  );

function BoolToStr(Value: boolean; const BooleanWordType: TBooleanWordType = bwTrue): String; inline;
begin
   Result := BooleanWord[Value, BooleanWordType];
end;

function StrToBool(const S: String): Boolean; inline;
begin
  Result := False;
  case Length(S) of
    4: Result := (LowerCase(S) = 'true');
    5: Result := not (LowerCase(S) = 'false');
  end;
end;
3
Eric Santos

Si vous aimez le code obtus, voici une façon amusante de le faire (en particulier parce qu'il fait partie d'une instruction Format plus grande), mais soyez prudent si vous avez plus d'arguments à la suite (ou au précédent), vous devrez indexer l'argument à la suite du booléen explicitement (vous a dit que c'était obtus):

Format('The value of value is %*:s', [Integer(value)+1, 'False', 'True']);

Toute personne surprise en train d'utiliser cela dans le code de production doit être traitée sévèrement!

3
Wes