9

文字列から数値を削除する方法を知りたいです。StringReplace を使用しようとしましたが、数値を置き換えたいことを関数に伝える方法がわかりません。

これが私が試したことです:

StringReplace(mString, [0..9], '', [rfReplaceAll, rfIgnoreCase]);
4

6 に答える 6

13

シンプルだが効果的。最適化できますが、最初に必要なものが得られるはずです。

function RemoveNumbers(const aString: string): string;
var
  C: Char;
begin
  Result := '';
  for C in aString do begin
      if not CharInSet(C, ['0'..'9']) then
      begin
        Result := Result + C;
      end;
    end;
end;
于 2012-05-31T18:33:45.637 に答える
5

かなりクイックなインプレース バージョン。

procedure RemoveDigits(var s: string);
var
  i, j: Integer;
  pc: PChar;
begin
  j := 0;
  pc := PChar(@s[1]);
  for i := 0 to Length(s) - 1 do
    if pc[i] in ['0'..'9'] then 
               //if CharInSet(pc[i], ['0'..'9']) for Unicode version
      Inc(j)
    else
      pc[i - j] := pc[i];
  SetLength(s, Length(s) - j);
end;
于 2012-05-31T19:21:01.090 に答える
5

これは Nick のバージョンと同じ出力ですが、短い文字列で 3 倍以上高速です。テキストが長いほど、差が大きくなります。

function RemoveNumbers2(const aString: string): string;
var
  C:Char; Index:Integer;
begin
  Result := '';
  SetLength(Result, Length(aString));
  Index := 1;
  for C in aString do
    if not CharInSet(C, ['0' .. '9']) then
    begin
      Result[Index] := C;
      Inc(Index);
    end;
  SetLength(Result, Index-1);
end;

必要がなければ、貴重な CPU サイクルを無駄にしないでください。

于 2012-06-09T03:27:39.017 に答える
1

すでにビルドされている関数を探すのにうんざりしていたので、独自の関数を作成しました。

   function RemoveNumbers(const AValue: string): string;
   var
      iCar : Integer;
      mBuffer : string;
   begin
      mBuffer := AValue;

      for iCar := Length(mBuffer) downto 1 do
      begin
         if (mBuffer[iCar] in ['0'..'9']) then
            Delete(mBuffer,iCar,1);
      end;
      Result := mBuffer;
   end;
于 2012-05-31T18:05:59.293 に答える
-1

StringReplaceは、2番目の引数としてセットを受け入れません。多分誰かがより適切なアプローチを持っているでしょう、しかしこれはうまくいきます:

StringReplace(mString, '0', '', [rfReplaceAll, rfIgnoreCase]);
StringReplace(mString, '1', '', [rfReplaceAll, rfIgnoreCase]);    
StringReplace(mString, '2', '', [rfReplaceAll, rfIgnoreCase]);

于 2012-05-31T17:42:11.177 に答える