文字列から数字のみを取り出す

解決


伊井尾  2009-06-05 23:17:28  No: 34618

すいません、教えてください。

文字列から数値のみを取り出す関数かなにかがあった気がしましたが、どなたかごぞんじですか?

GGGG1234HHH  →1234のみ


どやさ  2009-06-06 00:43:31  No: 34619

自動でとかかれていないから
Copy('GGGG1234HHH', 5, 4);  で  '1234'がとれる。

標準関数であっても、すごくつかえなくない?
'+''-'はどするの?
0が先頭の場合は無視するのしないの?
2バイト文字は?
数字が離れてる場合は?
小数点は?
条件ありすぎるんですけどね。

自分に都合よく自分で作るしかないんじゃないかな?


Manbon  2009-06-06 01:26:03  No: 34620

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;


QA  2009-06-06 07:43:14  No: 34621

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;


KHE00221  2009-06-06 21:08:35  No: 34622

そんなにゴチャゴチャしないでこれでよくない?

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;


moocho  2009-06-06 21:30:04  No: 34623

もし、RegExprなどの正規表現が使えれば

Edit1.Text := ReplaceRegExpr('[^0-9\n]|^\n','abc123efg456','',false);

..の結果
Edit1.Text に 123456 が入ります。

一行で完了!


伊井尾  2009-06-08 17:55:30  No: 34624

やっぱり特に標準関数ではないのですね。
みなさんありがとうございます!
とりあえず自分で作って取り出すようにします。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加