Kaynağa Gözat

解决冲突

MaiXinRong 9 yıl önce
ebeveyn
işleme
1f1e52c216
1 değiştirilmiş dosya ile 198 ekleme ve 0 silme
  1. 198 0
      Units/mPegFilter.pas

+ 198 - 0
Units/mPegFilter.pas

@@ -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.