文字列から数値を削除する方法を知りたいです。StringReplace を使用しようとしましたが、数値を置き換えたいことを関数に伝える方法がわかりません。
これが私が試したことです:
StringReplace(mString, [0..9], '', [rfReplaceAll, rfIgnoreCase]);
シンプルだが効果的。最適化できますが、最初に必要なものが得られるはずです。
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;
かなりクイックなインプレース バージョン。
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;
これは 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 サイクルを無駄にしないでください。
すでにビルドされている関数を探すのにうんざりしていたので、独自の関数を作成しました。
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;
StringReplaceは、2番目の引数としてセットを受け入れません。多分誰かがより適切なアプローチを持っているでしょう、しかしこれはうまくいきます:
StringReplace(mString, '0', '', [rfReplaceAll, rfIgnoreCase]);
StringReplace(mString, '1', '', [rfReplaceAll, rfIgnoreCase]);
StringReplace(mString, '2', '', [rfReplaceAll, rfIgnoreCase]);
等