有没有更简单的方法来进行布尔转换?
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
为真时基于TrueBoolStrs
和FalseBoolStrs
数组。因此,您可能并非总是在所有系统上都获得'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']);
任何被抓到在生产代码中使用它的人都应该受到严厉的处理!
【讨论】:
以上是关于有没有更简单的方法来进行布尔转换?的主要内容,如果未能解决你的问题,请参考以下文章