|
@@ -0,0 +1,198 @@
|
|
|
+unit mPegFilter;
|
|
|
+
|
|
|
+interface
|
|
|
+
|
|
|
+uses
|
|
|
+ Classes, SysUtils;
|
|
|
+
|
|
|
+type
|
|
|
+ TPegFilter = class
|
|
|
+ private
|
|
|
+ FBeginPeg: string;
|
|
|
+ FBeginPegNum: Double;
|
|
|
+ FEndPeg: string;
|
|
|
+ FEndPegNum: Double;
|
|
|
+
|
|
|
+ function PegFormat(const AStr: string): string;
|
|
|
+ function FilterPeg(const AStr: string; var APeg: string; var ANum: Double; var ABegin, AEnd: Integer): Boolean;
|
|
|
+ public
|
|
|
+ function Filter(const AStr: string): Boolean;
|
|
|
+
|
|
|
+ property BeginPeg: string read FBeginPeg;
|
|
|
+ property BeginPegNum: Double read FBeginPegNum;
|
|
|
+ property EndPeg: string read FEndPeg;
|
|
|
+ property EndPegNum: Double read FEndPegNum;
|
|
|
+ end;
|
|
|
+
|
|
|
+function PegFilter: TPegFilter;
|
|
|
+
|
|
|
+implementation
|
|
|
+
|
|
|
+uses Math;
|
|
|
+
|
|
|
+var
|
|
|
+ FPegFilter: TPegFilter;
|
|
|
+
|
|
|
+function PegFilter: TPegFilter;
|
|
|
+begin
|
|
|
+ if FPegFilter = nil then
|
|
|
+ FPegFilter := TPegFilter.Create;
|
|
|
+ Result := FPegFilter;
|
|
|
+end;
|
|
|
+
|
|
|
+{ TPegFilter }
|
|
|
+
|
|
|
+function TPegFilter.Filter(const AStr: string): Boolean;
|
|
|
+var
|
|
|
+ sPeg: string;
|
|
|
+ iPos, iBegin, iEnd: Integer;
|
|
|
+begin
|
|
|
+ sPeg := PegFormat(AStr);
|
|
|
+ Result := FilterPeg(sPeg, FBeginPeg, FBeginPegNum, iBegin, iEnd);
|
|
|
+ if Result and (sPeg[iEnd+1] = '~') then
|
|
|
+ begin
|
|
|
+ sPeg := StringReplace(sPeg, FBeginPeg, '', []);
|
|
|
+ FilterPeg(sPeg, FEndPeg, FEndPegNum, iBegin, iEnd);
|
|
|
+ if FEndPegNum = 0 then
|
|
|
+ begin
|
|
|
+ FEndPeg := FBeginPeg;
|
|
|
+ FEndPegNum := FBeginPegNum;
|
|
|
+ end
|
|
|
+ else
|
|
|
+ Result := FEndPegNum >= FBeginPegNum;
|
|
|
+ end
|
|
|
+ else
|
|
|
+ begin
|
|
|
+ FEndPeg := '';
|
|
|
+ FEndPegNum := 0;
|
|
|
+ end;
|
|
|
+end;
|
|
|
+
|
|
|
+function TPegFilter.FilterPeg(const AStr: string; var APeg: string;
|
|
|
+ var ANum: Double; var ABegin, AEnd: Integer): Boolean;
|
|
|
+
|
|
|
+ function FilterInt(ABegin: Integer; var AEnd: Integer; var AIntStr: string; var AValue: Integer): Boolean;
|
|
|
+ var
|
|
|
+ iPos, iLength: Integer;
|
|
|
+ sInt: string;
|
|
|
+ begin
|
|
|
+ AIntStr := '';
|
|
|
+ AEnd := ABegin;
|
|
|
+
|
|
|
+ iPos := ABegin;
|
|
|
+ iLength := Length(AStr);
|
|
|
+ while (iPos <= iLength) do
|
|
|
+ begin
|
|
|
+ if AStr[iPos] in ['0'..'9'] then
|
|
|
+ begin
|
|
|
+ AIntStr := AIntStr + AStr[iPos];
|
|
|
+ AEnd := iPos;
|
|
|
+ end
|
|
|
+ else Break;
|
|
|
+ Inc(iPos);
|
|
|
+ end;
|
|
|
+
|
|
|
+ Result := AIntStr <> '';
|
|
|
+ AValue := StrToIntDef(AIntStr, 0);
|
|
|
+ end;
|
|
|
+
|
|
|
+ // ¹ýÂËÒ»¸öСÓÚ1000µÄFloat
|
|
|
+ function FilterFloat(ABegin: Integer; var AEnd: Integer; var AFloatStr: string; var AValue: Double): Boolean;
|
|
|
+ var
|
|
|
+ iPos, iLength, iIntPartLength: Integer;
|
|
|
+ bHasPoint, bAllZero: Boolean;
|
|
|
+ begin
|
|
|
+ AFloatStr := '';
|
|
|
+ AEnd := ABegin;
|
|
|
+
|
|
|
+ iPos := ABegin;
|
|
|
+ iLength := Length(AStr);
|
|
|
+ bHasPoint := False;
|
|
|
+ bAllZero := True;
|
|
|
+ iIntPartLength := 0;
|
|
|
+ while (iPos <= iLength) do
|
|
|
+ begin
|
|
|
+ if AStr[iPos] in ['0'..'9'] then
|
|
|
+ begin
|
|
|
+ AFloatStr := AFloatStr + AStr[iPos];
|
|
|
+ AEnd := iPos;
|
|
|
+ if not bHasPoint then
|
|
|
+ Inc(iIntPartLength);
|
|
|
+
|
|
|
+ bAllZero := bAllZero and (AStr[iPos] = '0');
|
|
|
+ end
|
|
|
+ else if (AStr[iPos] = '.') and (not bHasPoint) then
|
|
|
+ begin
|
|
|
+ AFloatStr := AFloatStr + AStr[iPos];
|
|
|
+ AEnd := iPos;
|
|
|
+ bHasPoint := True;
|
|
|
+ end
|
|
|
+ else Break;
|
|
|
+ Inc(iPos);
|
|
|
+ end;
|
|
|
+
|
|
|
+ if iIntPartLength > 3 then
|
|
|
+ begin
|
|
|
+ AEnd := ABegin + 3 - 1;
|
|
|
+ AFloatStr := Copy(AFloatStr, 1, 3);
|
|
|
+ end;
|
|
|
+
|
|
|
+ AValue := StrToFloatDef(AFloatStr, 0);
|
|
|
+ Result := (AValue <> 0) or (bAllZero and (AEnd > ABegin));
|
|
|
+ end;
|
|
|
+
|
|
|
+var
|
|
|
+ iPos, iLength: Integer;
|
|
|
+ iBeginNum, iEndNum, iPosPuls, iBeginNum2, iEndNum2: Integer;
|
|
|
+ sNum, sNum2: string;
|
|
|
+ iNum: Integer;
|
|
|
+ fNum: Double;
|
|
|
+begin
|
|
|
+ Result := False;
|
|
|
+ APeg := '';
|
|
|
+ ANum := 0;
|
|
|
+ ABegin := -1;
|
|
|
+ AEnd := -1;
|
|
|
+
|
|
|
+ iPos := 1;
|
|
|
+ iLength := Length(AStr);
|
|
|
+ while (iPos <= iLength) and (not Result) do
|
|
|
+ begin
|
|
|
+ if AStr[iPos] = 'k' then
|
|
|
+ begin
|
|
|
+ iBeginNum := iPos + 1;
|
|
|
+ if FilterInt(iBeginNum, iEndNum, sNum, iNum) then
|
|
|
+ begin
|
|
|
+ iPosPuls := iEndNum + 1;
|
|
|
+ if AStr[iPosPuls] = '+' then
|
|
|
+ begin
|
|
|
+ iBeginNum2 := iPosPuls + 1;
|
|
|
+ if FilterFloat(iBeginNum2, iEndNum2, sNum2, fNum) then
|
|
|
+ begin
|
|
|
+ Result := True;
|
|
|
+ APeg := Copy(AStr, iPos, iEndNum2-iPos+1);
|
|
|
+ ANum := iNum * 1000 + fNum;
|
|
|
+ ABegin := iPos;
|
|
|
+ AEnd := iEndNum2;
|
|
|
+ end;
|
|
|
+ end;
|
|
|
+ end
|
|
|
+ end;
|
|
|
+ inc(iPos);
|
|
|
+ end;
|
|
|
+end;
|
|
|
+
|
|
|
+function TPegFilter.PegFormat(const AStr: string): string;
|
|
|
+begin
|
|
|
+ Result := AStr;
|
|
|
+ Result := StringReplace(Result, 'K', 'k', [rfReplaceAll]);
|
|
|
+ Result := StringReplace(Result, '£«', '+', [rfReplaceAll]);
|
|
|
+ Result := StringReplace(Result, '¡«', '~', [rfReplaceAll]);
|
|
|
+ Result := StringReplace(Result, ' ', '', [rfReplaceAll]);
|
|
|
+end;
|
|
|
+
|
|
|
+initialization
|
|
|
+ FPegFilter := nil;
|
|
|
+finalization
|
|
|
+ FPegFilter.Free;
|
|
|
+end.
|