'1,234.56abc789'から'1,234.56'を取り出す

解決


nuclei  2008-11-18 22:01:34  No: 32607

文字列の左から小数点、カンマ、数字のみを取り出し,
初めて非数字に出会うまでの文字列を取り出す関数を作っています。
愚直に書きますと↓

function TForm1.Suji(S: string): string;
var i:integer;
begin
  for i:=0 to length(S) do begin
    if S[i]='0' then Result:=Result+S[i];
    if S[i]='1' then Result:=Result+S[i];
    if S[i]='2' then Result:=Result+S[i];
    if S[i]='3' then Result:=Result+S[i];
    if S[i]='4' then Result:=Result+S[i];
    if S[i]='5' then Result:=Result+S[i];
    if S[i]='6' then Result:=Result+S[i];
    if S[i]='7' then Result:=Result+S[i];
    if S[i]='8' then Result:=Result+S[i];
    if S[i]='9' then Result:=Result+S[i];
    if S[i]='.' then Result:=Result+S[i];
    if S[i]=',' then Result:=Result+S[i];
  end;
end;

となりそうですが、これだと'789'まで取ってきそうです。
簡潔な記法を教えて下さい。(初歩的な質問ですみません))


ttt  2008-11-18 22:30:15  No: 32608

StringReplaceでカンマを消してからVal()でいいんじゃないでしょうか。
(-1.23E-10みたいな負数や指数表記を許可しないとしたらもう一工夫いりそうですが)

あくまでもその例の方式でやるとしたら、条件に合わない文字を見つけたところでBreakすればいいだけです。
ちなみに最初の文字の添字は0じゃなくて1です。あと、その条件判断は S[i] in ['0'..'9', '.', ','] みたいに簡略化できますね。


ofZ  2008-11-18 22:57:23  No: 32609

久々にValなんて使ってみたら、以下が、「123456」で返ってきました。
Val('1234.56abc', extended型変数, );

こちらは、「1234.56」
Val('1234.56', extended型変数, );

それはさておき、こんなものでいかが?
function Suji(S: string): string;
var
  i: Integer;
begin
  Result := '';
  for i := 1 to Length(S) do begin
    if not (S[i] in ['0'..'9', '.', ',']) then begin
      if i > 1 then Result := Copy(S, 1, i-1);
      Break;
    end;
  end;
end;


nuclei  2008-11-18 23:24:37  No: 32610

var Code:integer;
    V:double;

  S:=StringReplace(S,',','',[rfReplaceAll]);
  val(S,V,Code);
  if Code<>0 then Result:=leftstr(S,Code-1);

で'1234.56'が得られましたが、取り除いたカンマを戻さねばならないので、give up.
 
↓の方で解決しました。

for i:=1 to length(S) do
  if S[i] in ['0'..'9',',','.'] then  Result:=Result+S[i] else break;

ttt様、ofZ様、ありがとうございました。


monaa  2008-11-19 00:37:50  No: 32611

蛇足ですが、条件に当てはまらない文字を探して見つかったらそこまでをコピーしたほうが高速ですよ。


nuclei  2008-11-19 01:44:20  No: 32612

monaa様ありがとうございました。ofZ様が書いてくださったコードの意味がそこにあったことが、今わかりました(^^;)


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

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






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