2012-11-06 55 views
17

我几乎在所有的项目中都使用过这种场景,当我进行某种数据转换时,当谈到布尔值时,我觉得在简化它时会有点失落。下面这条语句伸出像突兀都在我的代码:是否有更简单的方法来进行布尔转换?

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

我不知道是否有进行这种评价更简单的方法?也许有些使用我不知道的Case声明?我的实际实现比StrVal更复杂,但它确实包含返回两个不同的值,具体取决于它是True还是False。例如,这里有一些实际的代码...

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

这只是为了强调我多么简单的希望。我想知道如果我能沿着这行做一些事情:

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

我敢肯定,这不是一个真正的命令,但我在寻找一个单行类型简单。

+0

好吧,这不是真正的“真实”的代码,但只是作为一个例子,我讨厌为每个布尔评估重复代码。 –

+0

您的语言是否支持三元运算符? StrVal =:BoolVal?'True':'False' – vgoff

+0

奇怪的是,我看到StackOverflow上与Delphi有关的确切的前一个问题也在问如何简化布尔比较。完全不同的问题与不同的答案,但他们两个背靠背... –

回答

36

在单位StrUtils,有就(ifthen)()

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

而对于这种特殊情况下,你甚至可以使用:

StrVal := BoolToStr(BoolVal); 
+4

美丽!所有这些年...... –

+0

BoolToStr已经在我的delphi版本(XE4)中转移到SysUtils – DamienD

+5

请注意''BoolToStr()'。当其UseBoolStrs参数为false(缺省值)时,它的输出为'-1'和'0',并且当UseBoolStrs为true时,它基于TrueBoolStrs和FalseBoolStrs数组。所以你可能不会在所有系统上总是得到“True”和“False”。如果你需要可预测的结果,IfThen()将是更好的选择。 –

7

对于布尔转换为字符串,有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,但是......

+0

谢谢,但Wouter的答案实际上完全填补了我的问题中的空白程序,我的“BoolToStrCase”确实是“IfThen” –

+0

+另一个1编辑但SO不会让我......我已经建立了这个它支持整数0/1或0 /> 0或0/<> 0等 –

+0

@KenWhite是TempStr只是为了训练手指? ; o) - 好吧,现在它是有道理的:o) –

20

嗷com'on没有人听说过由布尔索引的数组?

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

。 :-P –

+3

@UliGerhardt:嗯,是的,认为它也是丑陋的,但它在阅读代码时有助于识别常量,所以我很乐意地忍受这种丑陋。 ;-) –

+2

这是一个标准的代码格式化规则,总是大写常量 –

2

尝试其中之一。两者都比默认版本更快。

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; 
+1

这将转换为一个布尔值的字符串,但我做的是相反的,布尔值到字符串。 –

+0

@JerryDodge啊让我修改我的答案:)我也有一个解决方案。 –

+0

这里已经有比我需要更多的答案了,我发现很难相信还有另一个解决方案 –

2

如果你到钝代码,这里有一个有趣的方式来做到这一点(特别是它是一个更大的格式声明的一部分),但是要小心,如果你有更多的参数如下(或之前),你会有索引参数明确以下布尔(告诉你这是钝角):

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

任何在生产代码中使用这应该严肃处理!

相关问题