delphi - variable - ¿Hay una manera más fácil de hacer conversiones booleanas?
tipos de datos fundamentales (5)
He usado este escenario muchas veces en casi todos mis proyectos, cuando estoy haciendo algún tipo de conversión de datos, cuando se trata de booleanos, un poco me pierdo cuando se trata de hacerlo simple. La siguiente declaración sobresale como un pulgar dolorido en todo mi código:
if BoolVal then
StrVal:= ''True''
else
StrVal:= ''False'';
Me pregunto si hay una manera más fácil de realizar esta evaluación? Tal vez algún uso de la declaración del Case
que no conozco? Mi implementación real es más compleja que solo StrVal
pero consiste en devolver dos valores diferentes dependiendo de si es Verdadero o Falso. Por ejemplo, aquí hay un código real ...
if fsBold in Can.Font.Style then
ConvertTo(AddSomeOtherText + ''True'')
else
ConvertTo(AddSomeOtherText + ''False'');
Eso es solo para enfatizar en lo simple que estoy esperando. Me pregunto si puedo hacer algo como esto:
ConvertTo(AddSomeOtherText + BoolToStrCase((fsBold in Can.Font.Style), ''True'', ''False''));
Estoy seguro de que no es un comando real, pero estoy buscando ese tipo de simplicidad en una sola línea.
¿Qué tal nadie ha oído hablar de una matriz indexada por boolean?
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'');
De hecho, ¡es lo que BoolToStr usa!
function BoolToStr(B: Boolean; UseBoolStrs: Boolean = False): string;
const
cSimpleBoolStrs: array [boolean] of String = (''0'', ''-1'');
En la unidad StrUtils
, hay ifthen ()
StrVal := IfThen(BoolVal,''True'',''False'');
Y para este caso específico incluso podrías usar:
StrVal := BoolToStr(BoolVal);
Para convertir Boolean a string, hay BoolToStr , que ha existido desde al menos Delphi 2007. Puedes usarlo en tu último ejemplo como este:
TextVal := BoolToStr((fsBold in Can.Font.Style), True);
Para ir a la otra dirección (cadena a Boolean), tendrías que hacer una función real. Algo como esto debería ayudarte a comenzar:
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
Por supuesto, esto no funciona si hay Value
en el Value
, pero ...
Pruebe cualquiera de estos Ambos son mucho más rápidos que las versiones predeterminadas.
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;
Si te gusta el código obtuso, esta es una forma divertida de hacerlo (especialmente si es parte de una declaración de Formato más grande), pero ten cuidado si tienes más argumentos a continuación (o anteriores), tendrás que indexar el argumento siguiendo la boolean explícitamente (te dije que era obtuso):
Format(''The value of value is %*:s'', [Integer(value)+1, ''False'', ''True'']);
¡Cualquier persona atrapada usando este código de producción debe ser tratada severamente!