web-dev-qa-db-ja.com

ブール変換を行う簡単な方法はありますか?

ほぼすべてのプロジェクトでこのシナリオを何度も使用しました。ある種のデータ変換を行っているとき、ブール値に関して言えば、それを単純にすることで少し迷ってしまいます。以下のこのステートメントは、私のコード全体で痛い親指のように突き出ています。

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

この評価を実行する簡単な方法があるかどうか疑問に思っていますか?おそらく、私が知らないCaseステートメントのいくつかの使用法は?実際の実装は単なるStrValよりも複雑ですが、TrueかFalseかに応じて2つの異なる値を返すことで構成されています。たとえば、これが実際のコードです...

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

それは、私が期待している単純さを強調するためだけのものです。私はこれに沿って何かをすることができるかどうか疑問に思っています:

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

それは本当のコマンドではないと思いますが、1行でそのような単純さを探しています。

21
Jerry Dodge

ユニットStrUtilsには、ifthen()があります。

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

そして、この特定のケースでは、以下を使用することもできます。

StrVal := BoolToStr(BoolVal);
41

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

実際には、BoolToStr自体が使用します。

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

ブール値を文字列に変換するために、少なくともDelphi 2007以降で使用されている BoolToStr があります。これを最後の例で次のように使用できます。

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

他の方向(文字列からブール値)に進むには、実際の関数を実行する必要があります。このような何かがあなたを始めるはずです:

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

もちろん、これはValueにナンセンスがある場合は機能しませんが...

7
Ken White

これらのいずれかを試してください。どちらもデフォルトバージョンよりも高速です。

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

あいまいなコードに興味がある場合は、ここにそれを行う楽しい方法があります(特に、それがより大きなFormatステートメントの一部である場合)。ただし、後続(または先行)の引数が多い場合は、次の引数にインデックスを付ける必要があります。明示的にブール値(それが鈍いと言った):

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

これをプロダクションコードで使用している人は、厳しく対処する必要があります。

3
Wes