文字列の左から小数点、カンマ、数字のみを取り出し,
初めて非数字に出会うまでの文字列を取り出す関数を作っています。
愚直に書きますと↓
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'まで取ってきそうです。
簡潔な記法を教えて下さい。(初歩的な質問ですみません))
StringReplaceでカンマを消してからVal()でいいんじゃないでしょうか。
(-1.23E-10みたいな負数や指数表記を許可しないとしたらもう一工夫いりそうですが)
あくまでもその例の方式でやるとしたら、条件に合わない文字を見つけたところでBreakすればいいだけです。
ちなみに最初の文字の添字は0じゃなくて1です。あと、その条件判断は S[i] in ['0'..'9', '.', ','] みたいに簡略化できますね。
久々に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;
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様ありがとうございました。ofZ様が書いてくださったコードの意味がそこにあったことが、今わかりました(^^;)
ツイート | ![]() |