2012-11-06 6 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?«Истина»: «False» – vgoff

+0

Странно, я вижу, что точный предыдущий вопрос о StackOverflow, связанный с Delphi, также спрашивает, как сделать сравнение Boolean простым. Разный вопрос полностью с разными ответами, но оба из них спина к спине ... –

ответ

36

В блоке StrUtils, там ifthen()

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

И для этого конкретного случая вы можете даже использовать:

StrVal := BoolToStr(BoolVal); 
+4

Красивая! Все эти годы ... –

+0

BoolToStr перешел в SysUtils в моей версии delphi (XE4) – DamienD

+5

Будьте осторожны с 'BoolToStr()'. Его результат равен '' -1'' и ''0'', когда его параметр' UseBoolStrs' является ложным (по умолчанию) и основан на массивах 'TrueBoolStrs' и' FalseBoolStrs', когда 'UseBoolStrs' является истинным. Поэтому вы можете не всегда получать «True» и «False» во всех системах. 'IfThen()' будет лучшим выбором, если вам нужны предсказуемые результаты. –

7

Для преобразования Boolean в строку, есть BoolToStr, который был вы можете использовать его в своем последнем примере следующим образом:

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

Для перехода в другое направление (строка в Boolean) вам нужно будет выполнить фактическую функцию. Нечто подобное должно вам начать работу:

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

Спасибо, но ответ Ваутера на самом деле заполняет пустую процедуру пробела в моем вопросе отлично, мой «BoolToStrCase» действительно «IfThen» –

+0

+ еще один на редактирование, но 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

+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 Ah позвольте мне изменить мой ответ :) У меня есть решение для этого. –

+0

Здесь уже больше ответов, чем мне нужно, мне трудно поверить, что есть еще одно решение: –

2

Если вы в тупой код, вот интересный способ сделать это (особенно это часть большего заявления Format), но будьте осторожны, если у вас есть больше аргументов следующих (или предшествуют), вы будете должен индексировать аргумент после булевой явно (вам это было тупым):

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

Любой пойман, используя это в рабочем коде должны быть строго наказываться!

Смежные вопросы