【问题标题】:Detect if string contains a float?检测字符串是否包含浮点数?
【发布时间】:2013-11-26 22:14:52
【问题描述】:

如何检测字符串是否包含浮点数。例如:'0.004'

但不使用StrToFloat,因为该函数很慢,而是通过遍历字符来实现。

function IsInteger(const S: String): Boolean;
var
  P: PChar;
begin
  P := PChar(S);
  Result := True;
  while not (P^ = #0) do
  begin
    case P^ of
      '0'..'9': Inc(P);
    else
      Result := False;
      Break;
    end;
  end;
end;

这将检查字符串是否为正整数但不是浮点数..

【问题讨论】:

  • 您是如何发现它们运行缓慢的?是什么阻止你做你想做的事?
  • @TLama 在从 0 到 10000000 的循环中运行它们,你会明白我的意思。更不用说他们抛出异常了。
  • 好吧,IntToStr 和 StrToInt 在这里没有意义,因为你问的是浮点数。做任何事情 1000 万次,并期望等待一段时间。
  • @DavidHeffernan 哎呀。
  • 编辑添加代码后,您似乎将IntegerFloat 混淆了——您想要哪一个?

标签: delphi delphi-xe4


【解决方案1】:

我会使用 TryStrToFloat():

if TryStrToFloat(str, value, FormatSettings) then
  ....

如果您准备使用默认的系统宽格式设置,那么您可以省略最后一个参数:

if TryStrToFloat(str, value) then
  ....

【讨论】:

  • 你确定吗?在 Delphi 2009 中,它调用 TextToFloat
  • @TLama 是的,我确定。尝试转换非浮点数,它不会抛出异常。
  • @user 你为什么这么说?一个函数没有引发异常的事实并不能证明它调用了一个发生异常并捕获它的函数。真正发生的是 StrToFloat 调用 TryStrToFloat(或道德等价物),并在 TryStrToFloat 返回 False 时引发。
  • 算了。我仍然会这样做。如果您愿意提出性能要求,那么让我们看看我们是否可以做得比这更好。但是说“它很慢”并不是很有启发性。所以,如果你想谈性能,请你把你的要求说清楚。
  • 您需要多快?你的典型输入是什么?优化很大程度上取决于该信息。向我们展示您到目前为止所做的分析和时间安排。
【解决方案2】:

你可以在这里使用正则表达式吗?比如:

([+-]?[0-9]+(?:\.[0-9]*)?) 

【讨论】:

  • 比如1e1怎么样?
【解决方案3】:

这个问题的问题在于说“太慢”并不能说明什么。探查器告诉你什么?你对输入数据有一个明智的想法吗?不同的符号呢,例如6.02e23

如果您的输入数据主要是噪声,那么使用正则表达式(如回答 here)可能会改善情况,但只能作为第一个过滤器。然后,您可以添加第二步以实际获取您的号码,如 David's answer 所述。

【讨论】:

    猜你喜欢
    • 2020-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-20
    • 2019-03-13
    • 2013-07-11
    相关资源
    最近更新 更多