21

我在几乎所有的项目中都多次使用过这种场景,当我进行某种数据转换时,当涉及到布尔值时,在简化它时我有点迷茫。下面的这句话在我的代码中就像一个大拇指一样突出:

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

我确定这不是一个真正的命令,但我在一行中寻找那种简单性。

4

5 回答 5

44

在单元StrUtils中,有 ifthen()

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

对于这种特定情况,您甚至可以使用:

StrVal := BoolToStr(BoolVal);
于 2012-11-06T00:54:17.200 回答
24

Ow 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');
于 2012-11-06T06:36:43.387 回答
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,但是......

于 2012-11-06T00:55:20.843 回答
3

尝试其中任何一个。两者都比默认版本快得多。

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;
于 2013-11-23T14:09:21.480 回答
3

如果您喜欢钝化代码,这是一种有趣的方法(尤其是它是较大 Format 语句的一部分),但是如果您在后面(或前面)有更多参数,则必须小心,您必须在后面的参数索引明确的布尔值(告诉你它是钝的):

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

任何被抓到在生产代码中使用它的人都应该受到严厉的处理!

于 2015-07-01T16:37:41.160 回答