有没有更简单的方法来进行布尔转换?

Posted

技术标签:

【中文标题】有没有更简单的方法来进行布尔转换?【英文标题】:Is there an easier way to do boolean conversions? 【发布时间】:2012-10-25 22:06:25 【问题描述】:

我在几乎所有项目中都多次使用过这种场景,当我进行某种数据转换时,当涉及到布尔值时,在简化它时我有点迷茫。下面的这句话在我的代码中就像一个酸痛的拇指一样突出:

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

我想知道是否有更简单的方法来执行此评估?也许使用了我不知道的Case 声明?我的实际实现比StrVal 更复杂,但它确实包括返回两个不同的值,具体取决于它是真还是假。例如,这里有一些真实的代码......

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

这只是为了强调我希望的简单。我想知道我是否可以按照以下方式做一些事情:

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

我确定这不是一个真正的命令,但我正在寻找一行代码中的那种简单性。

【问题讨论】:

好吧,这不是真正的“真实”代码,只是作为一个例子,我讨厌为每个布尔评估重复代码。 你的语言支持三元运算符吗? StrVal =:布尔值? “真”:“假” 奇怪的是,我看到 *** 上与 Delphi 相关的确切问题也是在询问如何使布尔比较变得简单。完全不同的问题有不同的答案,但他们都是背靠背...... 【参考方案1】:

StrUtils单元中,有ifthen()

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

对于这种特定情况,您甚至可以使用:

StrVal := BoolToStr(BoolVal);

【讨论】:

BoolToStr 已移至我的 delphi 版本 (XE4) 中的 SysUtils 请注意BoolToStr()。当其UseBoolStrs 参数为假(默认)时,其输出为'-1''0',并且当UseBoolStrs 为真时基于TrueBoolStrsFalseBoolStrs 数组。因此,您可能并非总是在所有系统上都获得'True''False'。如果您需要可预测的结果,IfThen() 将是更好的选择。【参考方案2】:

没有人听说过布尔索引的数组吗?

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

【讨论】:

@UliGerhardt:啊,是的,我觉得它也很丑,但它有助于在阅读代码时识别常量,所以我很乐意忍受丑陋。 ;-) 常量大写的标准代码格式规则【参考方案3】:

对于将布尔值转换为字符串,有 BoolToStr,它至少从 Delphi 2007 开始就已经存在。您可以在最后一个示例中使用它,如下所示:

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有废话,这也行不通,但是……

【讨论】:

谢谢,但是Wouter的回答实际上完美地填补了我问题中的空白程序,我的“BoolToStrCase”真的是“IfThen” +another 1 on the edit but SO won't let me...我已经构建了它,它支持整数 0/1 或 0/>0 或 0/0 等。 @KenWhite 是 TempStr 只是为了训练手指? ;o) - 好的,现在说得通了 :o) @SirRufo:感谢您的关注。 :-) 当然,我使用它是因为UpperCase,但后来在代码中输入错误。再次感谢。 @Jerry:谢谢。我会把它留在这里,以防将来对其他人有帮助。【参考方案4】:

试试这些。两者都比默认版本快得多。

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;

【讨论】:

这会将字符串转换为布尔值,但我正在做相反的事情,将布尔值转换为字符串。 @JerryDodge 啊,让我修改我的答案:) 我也有一个解决方案。 这里的答案已经比我需要的多,我很难相信还有另一种解决方案 @JerryDodge 是的,而且更灵活;) 现在 StrToBool() 函数的方式,你可以删除整个5 大小写。当您提供“false”时,它会将结果设置为 false,但默认情况下它已经为 false。此外,当您调用 StrToBool('xxxxx') 时,它将返回 true,而 'xxxx' 或 'xxxxxx' 将返回 false。我认为这样的事情在这里会更好:function StrToBool(const s:string):boolean; var b:TBooleanType; begin for b:=low(TbooleanWordType) to high(TbooleanWordType) do if SameText(BooleanWord[true,b],s) then Exit(True); Exit(False) end;【参考方案5】:

如果你喜欢钝化代码,这里有一个有趣的方法(尤其是它是更大的 Format 语句的一部分),但要小心,如果后面(或前面)有更多参数,你将不得不索引明确地遵循布尔值的参数(告诉你它是钝的):

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

任何被抓到在生产代码中使用它的人都应该受到严厉的处理!

【讨论】:

以上是关于有没有更简单的方法来进行布尔转换?的主要内容,如果未能解决你的问题,请参考以下文章

将 int 转换为布尔值的更好方法

有没有简单的方法将布尔值转换为整数?

AWS Glue 布尔转换

安全布尔成语 - 我找到了更简单的方法,还是我错过了啥?

TypeScript:将布尔值转换为字符串值

Java:将原始布尔值转换为原始 int (0,1) 的好方法