Lazarus将备忘录中的数字显示为例如列表框

时间:2014-09-27 08:59:51

标签: lazarus

我有这些数据:

CMD210 STA_ 99.0 uS Temp 22.1 C

CMD210 STAB 99.9 uS Temp 22 C

CMD210 STAB 0.1 mS Temp 22.1 C

CMD210 STA_ 99.5 uS Temp 22.1 C

CMD210 STAB 99.4 uS Temp 22 C

CMD210 ST__ 99.0 uS Temp 22.2 C

CMD210 STAB 0.1 mS Temp 22 C

CMD210 STAB 99.3 uS Temp 22.2 C

我想有一个程序在列表框中显示备忘录的温度。

我知道我必须得到循环和带有'p'和'c'的2个字符的东西,因为数字介于那些字母之间....

procedure TForm1.Button4Click(Sender: TObject);
  var
    midlet,midler:char;
    resultat,x:integer;
    linecount,index:integer;
    found: boolean;
begin
midlet:= 'p';
  midler:='C';
  index:=0;
  resultat:=midlet+x+midler
  found := false;
  linecount := Memo1.lines.count;
 while index<= linecount - 1 do
 begin
   if x = memo1.lines[index] then
   found := true;
   index :=index + 1;
   end
 if found = true then
   ListBox1.text:= floattostrF(x,ffFixed,15,2);
 end; 

1 个答案:

答案 0 :(得分:0)

您的示例中存在多个问题,因此此答案仅限于&#34;如何从一行&#34; 中提取和转换温度。从根本上说,您有两种方法可以完成任务:

  • 使用regular expressions
  • 编写自定义解析器。

自定义解析器很容易编写:

  • 在标识符中累积非空白字符。
  • 如果标识符等于Temp,则定义标记。
  • 如果定义了标志并且已经积累了某些内容,则将标识符转换为double。

示例:

program Project1;

uses
  sysutils;

const
  line1 = 'CMD210 STAB 99.3 uS Temp 22.2 C';
  line2 = 'CMD210 STAB 0.1 mS Temp 22 C';
  line3 = 'it is quite hot over there Temp 55.123456 C';
  line4 = 'bla bla bla bla 12.564 C';
  line5 = '';

function getTemperature(aLine: string): double;
var
  reader: PChar;
  identifier: string;
  AccumulateTemp: boolean;
const
  _Nan = 0/0;
begin
  // initialize local variables.
  identifier := '';
  AccumulateTemp := false;
  // success can be tested with isNan()
  result := _Nan;
  // add a distinct terminal char:
  aLine := aLine + #0;
  reader := @aLine[1];

  while(true) do begin
    if reader^= #0 then
      exit;
    // blank: test the identifier
    if reader^ in [#9, ' '] then
    begin
      if AccumulateTemp then
      begin
        if not TryStrToFloat(identifier, result) then
          result := _Nan;
        AccumulateTemp := false;
        exit;
      end;
      if identifier = 'Temp' then
        AccumulateTemp := true;
      identifier := '';
    end else
    // accumulate
      identifier := identifier + reader^;
    Inc(reader);
  end;
end;

begin
  DecimalSeparator := '.';
  writeln( format('%.7f', [getTemperature(line1)])  );
  writeln( format('%.7f', [getTemperature(line2)])  );
  writeln( format('%.7f', [getTemperature(line3)])  );
  writeln( format('%.7f', [getTemperature(line4)])  );
  writeln( format('%.7f', [getTemperature(line5)])  );
  readln;
end.

输出

22.2000000
22.0000000
55.1234560
Nan
Nan