2012-11-06 15 views
17

Użyłem tego scenariusza wiele razy w prawie wszystkich moich projektach, kiedy robię jakąś konwersję danych, jeśli chodzi o booleans, trochę się gubię, jeśli chodzi o upraszczanie. To oświadczenie poniżej wystaje jak bolesny kciuk po całym moim kodzie:Czy istnieje łatwiejszy sposób na konwersję wartości logicznych?

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

Zastanawiam się, czy istnieje łatwiejszy sposób przeprowadzenia tej oceny? Być może jakieś użycie oświadczenia Case, o którym nie wiem? Moja aktualna implementacja jest bardziej skomplikowana niż tylko StrVal, ale polega na zwrocie dwóch różnych wartości w zależności od tego, czy jest to prawda, czy fałsz. Na przykład, oto prawdziwy kod ...

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

To tylko podkreślenie, jak prosto mam nadzieję. Zastanawiam się, czy mogę zrobić coś na wzór tego:

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

Jestem pewien, że nie jest prawdziwy poleceń, ale szukam dla tego typu uproszczenia w jednej linii.

+0

OK, który nie był tak naprawdę "prawdziwym" kodem, ale jako przykład nienawidzę powielania kodu dla każdej oceny boolowskiej. –

+0

Czy twój język obsługuje operatora trójskładnikowego? StrVal =: BoolVal?"Prawda": "Fałsz" – vgoff

+0

O dziwo, widzę, że dokładne poprzednie pytanie dotyczące StackOverflow związane z Delphi jest również pytaniem, jak zrobić proste porównanie Boole'a. Różne pytania całkowicie z różnymi odpowiedziami, ale obaj z powrotem do siebie ... –

Odpowiedz

36

W jednostce StrUtils, tam jest ifthen()

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

I w tym konkretnym przypadku można nawet użyć:

StrVal := BoolToStr(BoolVal); 
+4

Pięknie! Przez te wszystkie lata ... –

+0

BoolToStr przeniósł się do SysUtils w mojej wersji delphi (XE4) – DamienD

+5

Uważaj z 'BoolToStr()'. Jego wyjście to ''-1'' i'' 0'', gdy jego parametr 'UseBoolStrs' jest wartością false (domyślnie) i jest oparty na tablicach' TrueBoolStrs' i 'FalseBoolStrs', gdy' UseBoolStrs' ma wartość true. Więc nie zawsze możesz uzyskać "True" i "Fałsz" na wszystkich systemach. 'If ​​Then()' byłby lepszym wyborem, jeśli potrzebujesz przewidywalnych wyników. –

7

Do konwersji Boolean ciąg, nie BoolToStr, który został od co najmniej Delphi 2007. Możesz go użyć w swoim ostatnim przykładzie:

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

Aby przejść w innym kierunku (ciąg do Boolean), musisz wykonać rzeczywistą funkcję. Coś jak to powinno Ci zacząć:

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 

Oczywiście, to nie zadziała, jeśli nie ma sensu w Value, ale ...

+0

Dzięki, ale odpowiedź Woutera faktycznie wypełnia procedurę pustej luki w moim pytaniu, idealnie, mój "BoolToStrCase" jest naprawdę "If Then" –

+0

+ kolejny 1 na edycji, ale SO nie pozwala mi ... Zbudowałem to już i obsługuje liczby całkowite 0/1 lub 0 /> 0 lub 0/<> 0 itd. –

+0

@KenWhite to TempStr tylko do treningu palców? ; o) - ok, teraz ma sens: o) –

20

Ow, dalej nikt nigdy nie słyszał o tablicy indeksowanej przez logiczną ?

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

W rzeczywistości to samo wykorzystuje BoolToStr!

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

+1 pomimo brzydkiej pisowni wielkimi literami. :-P –

+3

@UliGerhardt: Ach, tak, myślę, że to też jest brzydkie, ale pomaga w rozpoznawaniu stałych podczas czytania kodu, więc cierpię z radością brzydotę. ;-) –

+2

Jest to standardowa reguła formatowania kodu, która zawsze zamienia stałe. –

2

Wypróbuj jedną z nich. Oba są znacznie szybsze niż wersje domyślne.

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

Konwertowałoby to ciąg na boolowskie, ale robię odwrotnie, boolean na ciąg. –

+0

@JerryDodge Ah, pozwól mi zmodyfikować moją odpowiedź :) Mam również rozwiązanie. –

+0

Jest tu już więcej odpowiedzi niż potrzebuję, trudno mi uwierzyć, że jest jeszcze inne rozwiązanie –

2

Jeśli jesteś w kodzie rozwarty, tutaj jest to świetny sposób, aby to zrobić (szczególnie jest to część większego rachunku Format), ale należy zachować ostrożność, jeśli masz więcej argumentów następujące (lub wcześniej), to będzie mają indeksować argument, zgodnie z logiczną jawnie (mówiłem, że był rozwarty):

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

Każdy złapany na używaniu tego w kodzie produkcji powinny być traktowane poważnie!

Powiązane problemy