掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
Trim関数で大文字スペースもTrim対象にしたい (ID:14329)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
みなさん...こういうときって 将来の汎用性を考えて手続き書かない? 全角だけじゃなくて、全ての文字で 動作するように対応しておきたくなったり 先頭と末端指定も書きたくなったり、、、 それにファーストテストも実施するべき。 そうしておくとバグが減らせる。 このスレで起きてたような凡ミスも防止できるし 関数の信頼性やリファクタリングのような応用にもつながるよ。 const EmptyStr: WideString = ''; function TrimLeftChar(S: WideString; Table: WideString): WideString; var i: Integer; WriteIndex: Integer; TrimFlag: Boolean; begin SetLength(Result, Length(S)); WriteIndex := 0; TrimFlag := True; for i := 1 to Length(S) do begin if not (TrimFlag and (1<=Pos(S[i], Table))) then begin TrimFlag := False; Inc(WriteIndex); Result[WriteIndex] := S[i]; end; end; SetLength(Result, WriteIndex); { ----------------------------------- //低速だがコードが短い方の実装 begin while (S<>EmptyStr) and (1<=Pos(S[1], Table)) do Delete(S, 1, 1); Result := S; end; //----------------------------------- } end; function TrimRightChar(S: WideString; Table: WideString): WideString; var i: Integer; WriteIndex: Integer; begin Result := S; WriteIndex := Length(Result); for i := Length(S) downto 1 do begin if (1<=Pos(S[i], Table)) then begin Dec(WriteIndex); end else begin break; end; end; SetLength(Result, WriteIndex); { ----------------------------------- //低速だがコードが短い方の実装 begin while (S<>EmptyStr) and (1<=Pos(S[Length(S)], Table)) do Delete(S, Length(S), 1); Result := S; end; //----------------------------------- } end; function TrimChar(S: WideString; Table: WideString): WideString; begin Result := TrimLeftChar(TrimRightChar(S, Table), Table); end; procedure Check(A, B: String); begin if not(A = B) then begin raise Exception.Create('エラーです ' + A + ':' + B); end; end; procedure testTrimLeftChar; begin Check('あ', TrimLeftChar(' あ', ' ')); Check('う', TrimLeftChar(' う', ' ')); Check('か', TrimLeftChar('あいうえおああいいか', 'あいうえお')); Check('X', TrimLeftChar(' YY X', ' Y')); Check('789', TrimLeftChar('012346789', '6543210')); Check('ABCXYZ', TrimLeftChar('XXYYZZABCXYZ', 'XYZ')); Check('', TrimLeftChar('XXYYZZABCXYZ', 'XYZABC')); Check('AAA'#9, TrimLeftChar(#9'AAA'#9, #9)); Check(#9, TrimLeftChar('AAA'#9, 'A')); Check(#9'AAA', TrimLeftChar(#13#10#9'AAA', #13#10)); Check(#13#10, TrimLeftChar(#9'AAA'#13#10, #9'A')); Check('123', TrimLeftChar('123', '')); end; procedure testTrimRightChar; begin Check(' ', TrimRightChar(' あ', 'あ')); Check('あいうえお', TrimRightChar('あいうえおああいいか', 'かいあ')); Check('う', TrimRightChar('う ', ' ')); Check(' YY', TrimRightChar(' YY X', ' X')); Check('012', TrimRightChar('012346789', '346789')); Check('XXYYZZABC', TrimRightChar('XXYYZZABCXYZ', 'XYZ')); Check('', TrimRightChar('XXYYZZABCXYZ', 'XYZABC')); Check(#9'AAA', TrimRightChar(#9'AAA'#9, #9)); Check(#9, TrimRightChar(#9'AAA', 'A')); Check(#9'AAA', TrimRightChar(#9'AAA'#13#10, #13#10)); Check(#13#10, TrimRightChar(#13#10#9'AAA', #9'A')); Check('123', TrimRightChar('123', '')); end; procedure testTrimChar; begin Check('ABC', TrimChar('123467829ABC5212694192', '0123456789')); Check('', TrimChar('123467829ABC5212694192', 'ABC0123456789')); Check('かきくけこ', TrimChar('あいうえああいいかきくけこおおえういあい', 'あいうえお')); Check('AAA', TrimChar(#9'AAA'#9, #9)); Check(#9, TrimChar(#9'AAA', 'A')); Check(#9'AAA', TrimChar(#9'AAA'#13#10, #13#10)); Check(#13#10, TrimChar(#9'AAA'#13#10, #9'A')); Check('123', TrimChar('123', '')); end;
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.