【问题标题】:Delphi: search string with arrayDelphi:用数组搜索字符串
【发布时间】:2022-01-08 11:07:13
【问题描述】:

我需要一些 Delphi 计算器,有时我的号码包括 '<''>'。我需要储存它们以备后用。例如:

fnc_ProcessNumber('0.320>','100',multiplication)

这需要给出这个输出:320>,但是这一行失败了:

boolControl := ContainsText(strEnteredResult,[lessThan,greaterThan]);

我也试试这个:

boolControl := IndexStr(strEnteredResult,[lessThan,greaterThan]);

这是我的代码和类型。

type TMaths  =  (addition,subtraction,multiplication,division);

function fnc_ProcessNumber(strEnteredResult,strProcessedNumber:string;Math:TMaths) : string;
const lessThan : string = '<';
const greaterThan : string = '>';
var
  intIndexCounter,intIndexMath:Integer;
  extNewResult:Extended;
  boolControl,boolLess,boolGreater:Boolean;
begin
  Result := 'null';
  boolControl := ContainsText(strEnteredResult,[lessThan,greaterThan]);
  if boolControl then
  begin
    case intIndexCounter of
      0:
        begin
          intIndexMath := AnsiPos(lessThan,strEnteredResult);
          boolLess := True;
        end;
      1:
        begin
          intIndexMath := AnsiPos(greaterThan,strEnteredResult);
          boolGreater := True;
        end;
    end;
    strProcessedNumber := Copy(strEnteredResult,intIndexMath,1);
  end
  else
  begin
    extNewResult := StrToFloat(strEnteredResult);
  end;
  case Math of
    addition:
      begin
        extNewResult := extNewResult + StrToFloat(strProcessedNumber);
      end;
    subtraction:
      begin
        extNewResult := Abs(extNewResult - StrToFloat(strProcessedNumber));
      end;
    multiplication:
      begin
        extNewResult := extNewResult * StrToFloat(strProcessedNumber);
      end;
    division:
      begin
        extNewResult := extNewResult / StrToFloat(strProcessedNumber);
      end;
  end;
  Result       := FloatToStr(extNewResult);
  if boolLess then Result := lessThan+Result;
  else if boolGreater then Result := Result+greaterThan;
end;

【问题讨论】:

  • 对于您的下一个问题,请尝试隔离一个单个问题。例如,“给定一个字符串 S 和一个字符串数组 Arr,我如何找出 Arr 中是否存在一个元素 A,使得 A 是 S 的子字符串”,甚至没有提到计算器部分。
  • 不应该是 32> 而不是 320>

标签: arrays delphi search


【解决方案1】:

好吧,ContainsText 显然不能使用,因为它的第二个参数是单个字符串,而不是字符串数组。

并且IndexStr 也不能使用,因为它只是测试文本是否(完全)是数组的元素之一;它不做任何子串测试。此外,它返回一个整数、匹配的索引或 -1,因此您需要将结果与&lt;&gt; -1 进行比较以获得布尔值。或者,您可以使用 MatchStr 为您进行此测试。

最后,ContainsText 不区分大小写,而 IndexStr 不区分大小写。最好将ContainsTextIndexText/MatchTextContainsStrIndexStr/MatchStr 进行比较:

Case sensitive Case insensitive
Substring found in string? ContainsStr ContainsText
Index of string in string array. IndexStr IndexText
String found in string array? (Index &lt;&gt; -1) MatchStr MatchText

因此,这些函数都不会测试 (1) 字符串是否是字符串数组中任何字符串的子字符串或 (2) 字符串数组中的任何字符串是否是给定字符串的子字符串。

当然,编写这样的函数完全是微不足道的。这是第二种情况:

function ContainsAnyStr(const AText: string; const AStrings: array of string): Boolean;
begin
  for var i := 0 to High(AStrings) do
    if ContainsStr(AText, AStrings[i]) then
      Exit(True);
  Result := False;
end;

function ContainsAnyText(const AText: string; const AStrings: array of string): Boolean;
begin
  for var i := 0 to High(AStrings) do
    if ContainsText(AText, AStrings[i]) then
      Exit(True);
  Result := False;
end;

另外,由于你的字符串数组其实是字符数组,所以可以使用TStringHelper.IndexOfAny

'123>'.IndexOfAny(['<', '>']) <> -1

【讨论】:

  • 当然,您的代码中还有其他几个错误。例如,intIndexCounter 是一个未初始化的变量。
  • 或者您正在寻找var HasMark := S.EndsWith('&gt;') or S.EndsWith('&lt;');var HasGT := S.EndsWith('&gt;'); var HasLT := S.EndsWith('&lt;'); var HasMark := HasGT or HasLT; 或者使用Contains 而不是EndsWith,如果这是您想要的。
  • IndexOfAny 完成了这项工作。感谢@andreas 的建议
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-06
  • 2012-01-13
  • 2013-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多