Подтвердить что ты не робот

Есть ли более простой способ делать логические преобразования?

Я использовал этот сценарий много раз почти во всех моих проектах, когда я делаю какое-то преобразование данных, когда дело доходит до логических значений, я немного теряюсь, когда дело доходит до простого его использования. Это утверждение ниже выглядит как больной палец по всему моему коду:

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

Я уверен, что это не настоящая команда, но я ищу эту простоту в одной строке.

4b9b3361

Ответ 1

В блоке StrUtils существует ifthen()

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

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

StrVal := BoolToStr(BoolVal);

Ответ 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');

Ответ 3

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

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 есть бессмыслица, но...

Ответ 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;

Ответ 5

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

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

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