Vraag Is er een eenvoudigere manier om booleaanse conversies te doen?


Ik heb dit scenario vele malen gebruikt in bijna al mijn projecten, als ik een soort gegevensconversie aan het uitvoeren ben, als het gaat om booleans, raak ik een beetje verdwaald als het er op aan komt om het eenvoudig te maken. Deze verklaring hieronder steekt als een pijnlijke duim uit over mijn code:

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

Ik vraag me af of er een eenvoudigere manier is om deze evaluatie uit te voeren? Misschien enig gebruik van de Case verklaring waar ik niet van weet? Mijn daadwerkelijke implementatie is complexer dan alleen StrVal maar het bestaat uit het retourneren van twee verschillende waarden, afhankelijk van of het waar of onwaar is. Hier is bijvoorbeeld wat echte code ...

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

Dat is alleen maar om te benadrukken hoe eenvoudig ik hoop. Ik vraag me af of ik iets in de trant van dit kan doen:

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

Ik weet zeker dat dat geen echt commando is, maar ik ben op zoek naar dat soort eenvoud in één regel.


17
2017-11-06 00:49


oorsprong


antwoorden:


In de eenheid StrUtils, er is ifthen ()

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

En voor dit specifieke geval zou je zelfs kunnen gebruiken:

StrVal := BoolToStr(BoolVal);

36
2017-11-06 00:54



Ow com'on niemand ooit gehoord van een array geïndexeerd door boolean?

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');

Het is in feite wat BoolToStr zelf gebruikt!

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

22
2017-11-06 06:36



Voor het converteren van Boolean naar string, er is BoolToStr, wat al bestaat sinds Delphi 2007. Je kunt het in je laatste voorbeeld als volgt gebruiken:

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

Om de andere richting te gaan (string naar Boolean), zou je een echte functie moeten uitvoeren. Zoiets zou je op weg moeten helpen:

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

Dit werkt natuurlijk niet als er onzin in zit Value, maar...


7
2017-11-06 00:55



Probeer een van deze. Beide zijn veel sneller dan standaardversies.

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;

2
2017-11-23 14:09



Als je geheime code gebruikt, is hier een leuke manier om het te doen (vooral omdat het deel uitmaakt van een grotere Format-instructie), maar wees voorzichtig als je meer argumenten volgt (of ervoor), dan zul je het argument na de index moeten indexeren boolean expliciet (zei je dat het stom was):

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

Iedereen die betrapt is tijdens het gebruik van deze code in de productie, moet serieus worden behandeld!


2
2017-07-01 16:37