すいません、教えてください。
文字列から数値のみを取り出す関数かなにかがあった気がしましたが、どなたかごぞんじですか?
GGGG1234HHH →1234のみ
自動でとかかれていないから
Copy('GGGG1234HHH', 5, 4); で '1234'がとれる。
標準関数であっても、すごくつかえなくない?
'+''-'はどするの?
0が先頭の場合は無視するのしないの?
2バイト文字は?
数字が離れてる場合は?
小数点は?
条件ありすぎるんですけどね。
自分に都合よく自分で作るしかないんじゃないかな?
0〜9まででいいのだったら、こんなもんですかねぇ
procedure TForm1.Button1Click(Sender: TObject);
var
iw: Word;
sa1, sa2: AnsiString;
begin
sa1 := Edit1.Text;
sa2 := '';
for iw := 1 to Length(sa1) do begin
if (Ord(sa1[iw]) >= 48) and (Ord(sa1[iw]) <= 57) then begin
sa2 := sa2 + sa1[iw];
end else begin
if sa2 <> '' then Break;
end;
end;
showmessage(sa2);
end;
0〜9 までだったらこんなのも。文字列から単純に半角数字だけを取り出すだけの関数です。
[対象文字列]
ちまたの噂によるとDelphi2005は起動時間が遅いことで有名だった。Delphi2006になってこの問題は解消されらしい。最新版の2009の起動時間はどんなものなのだろう? それにしてもProfessional版で102900円もするのか。
[結果]
2005
2006
2009
102900
//半角数字を得る(Delphi5)
function GetNumberStr(const S: string): string;
var
i, k, L: Integer;
P : PChar;
Temp: TStringList;
begin
if S = '' then Exit;
L := Length(S);
i := 1;
try
P := StrAlloc(1000); //適当^O^; まあ、1000桁以上の数値はめったにないかと
Temp := TStringList.Create;
repeat
if S[i] in [#$81..#$9F, #$E0..#$FC] then Inc(i,2)
else
begin
if S[i] in ['0'..'9'] then
begin
k := 0;
repeat
P[k] := S[i];
Inc(i); Inc(k);
until not (S[i] in ['0'..'9']);
P[k] := #0; Temp.Add(String(P));
end
else
Inc(i);
end;
until i > L;
Result := Temp.Text;
finally
Temp.Free;
StrDispose(P);
end;
end;
そんなにゴチャゴチャしないでこれでよくない?
function GetNumber(Text: WideString): String;
var
I: Integer;
begin
for I:=0 to Length(Text) -1 do
begin
if Text[I] in ['0'..'9'] then Result := Result + Text[I];
end;
end;
もし、RegExprなどの正規表現が使えれば
Edit1.Text := ReplaceRegExpr('[^0-9\n]|^\n','abc123efg456','',false);
..の結果
Edit1.Text に 123456 が入ります。
一行で完了!
やっぱり特に標準関数ではないのですね。
みなさんありがとうございます!
とりあえず自分で作って取り出すようにします。
ツイート | ![]() |