2012-11-06 39 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']);

任何在生產代碼中使用這應該嚴肅處理!

相關問題