有没有更简单的方法来进行布尔转换?

Jer*_*dge 19 delphi boolean type-conversion delphi-xe2

我在几乎所有的项目中都多次使用过这个场景,当我进行某种数据转换时,当涉及到布尔值时,我觉得在简单化方面有点迷失.下面的声明就像我的代码中的一个痛苦的拇指:

if BoolVal then
  StrVal:= 'True'
else
  StrVal:= 'False';
Run Code Online (Sandbox Code Playgroud)

我想知道是否有更简单的方法来执行此评估?或许有些使用Case我不了解的陈述?我的实际实现比仅仅更复杂,StrVal但它确实包括返回两个不同的值,具体取决于它是True还是False.例如,这里有一些真正的代码......

if fsBold in Can.Font.Style then
  ConvertTo(AddSomeOtherText + 'True')
else
  ConvertTo(AddSomeOtherText + 'False');
Run Code Online (Sandbox Code Playgroud)

这只是为了强调我希望有多简单.我想知道我是否可以按照以下方式做点什么:

ConvertTo(AddSomeOtherText + BoolToStrCase((fsBold in Can.Font.Style), 'True', 'False'));
Run Code Online (Sandbox Code Playgroud)

我确信这不是一个真正的命令,但我在一条线上寻找那种简单性.

Wou*_*ick 41

在单位StrUtils,有ifthen()

StrVal := IfThen(BoolVal,'True','False');
Run Code Online (Sandbox Code Playgroud)

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

StrVal := BoolToStr(BoolVal);
Run Code Online (Sandbox Code Playgroud)

  • 请注意`BoolToStr()`.当`UseBoolStrs`参数为false(默认值)时,它的输出为'-1'和'0',当`UseBoolStrs`为真时,它的输出基于`TrueBoolStrs`和`FalseBoolStrs`数组.所以你可能并不总是在所有系统上得到"真"和"假".如果你需要可预测的结果,那么IfThen()`会是更好的选择. (6认同)

Mar*_*ema 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');
Run Code Online (Sandbox Code Playgroud)

事实上,BoolToStr本身就是用它!

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

  • @UliGerhardt:啊,是的,认为它也很难看,但它有助于在阅读代码时识别常数,所以我很高兴地忍受着丑陋.;-) (6认同)
  • 这是一个标准的代码格式规则,总是大写常量 (4认同)

Ken*_*ite 7

为了将布尔值转换为字符串,有BoolToStr,它至少从Delphi 2007开始就存在.您可以在上一个示例中使用它,如下所示:

TextVal := BoolToStr((fsBold in Can.Font.Style), True);
Run Code Online (Sandbox Code Playgroud)

要转向另一个方向(字符串为布尔值),您必须执行实际功能.这样的事情应该让你开始:

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
Run Code Online (Sandbox Code Playgroud)

当然,如果有废话,这不起作用Value,但......