DelFusa Blog 総本山

プログラミングの話題とかです。

NEW | PAGE-SELECT | NEXT

≫ EDIT

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

| スポンサー広告 | --:-- | comments(-) | trackbacks(-) | TOP↑

≫ EDIT

文字列連結


   ∧,,∧   アチーネー
  ミ,,゚Д゚彡
   ミつ目(ミ
 @ミ   ミ   
   ∪''∪


いやあ、こんにちは。ご無沙汰振りっす。

みなさん、どうですか?放射能。汚染されてますか?

あ、、、されてないですか?
それはよかったです。

さてさて、ブログは更新しませんが、Delphiプログラムは日々しつづけている漏れですが、みなさんはいかがでしょうか?



最近は、文字列連結に動的配列パラメータを使ってシンプルに書いてみたものの
これがやたらつかいやすかったので使い続けてしまっています。

GetStringLineConnect(['あいうえお', 'かきくけこ', 'さしすせそ']);
とすると、改行区切りで文字列が連結できたり
GetStringConnect(',', ['あいうえお', 'かきくけこ', 'さしすせそ']);

このようにするとカンマ区切りで連結されます。
SQL文を作るときのような場面でStringListにAddしなくてもよかったりします。
パラメータをカンマで連結するときもありますからね。


ソースは次の通り。

function GetStringConnect(ConnectText: String; SourceTests: array of String): String;
var
 I: Integer;
begin
 Result := '';

 if 1 <= Length(SourceTests) then
 begin
  if SourceTests[0] = '' then
   Result := ''
  else
   Result := SourceTests[0] + ConnectText;
 end;
 for I := 1 to Length(SourceTests) - 1 do
 begin
  Result := Result + SourceTests[I] + ConnectText;
 end;
 Result := ExcludeLastStr(Result, ConnectText);
end;

//改行で連結する
function GetStringLineConnect(SourceTests: array of String): String;
begin
 Result := GetStringConnect(CRLF, SourceTests);
end;

CRLFは定数として定義しています。

ExcludeLastStrは、文字列の終端が指定文字列と一緒なら取り除く関数
たしかDelphi標準だとEndStrだったかな。
私は自前関数があるのでそちらを利用しています。


このExcludeシリーズは次のようにして実装されています。
先頭と終端とでの文字列一致を確認する関数と
それを利用した先頭と終端にIncludeする関数とExcludeする関数。


type
 TCaseCompare = (ccCaseSensitive, ccIgnoreCase);

function IsFirstStr(const S, SubStr: String; CaseCompare: TCaseCompare = ccCaseSensitive{IgnoreCase=False}): Boolean;
begin
 Result := StringPartsCompareCase(SubStr, S, 1, CaseCompare);
end;

function IsLastStr(const S, SubStr: String;
CaseCompare: TCaseCompare = ccCaseSensitive): Boolean;
begin
 Result := StringPartsCompareCase(SubStr, S, Length(S)-Length(SubStr)+1, CaseCompare);
end;

function IncludeFirstStr(const S, SubStr: String;
CaseCompare: TCaseCompare = ccCaseSensitive): String;
begin
 if IsFirstStr(S, SubStr, CaseCompare) then
 begin
  Result := S;
 end else
 begin
  Result := SubStr + S;
 end;
end;

function IncludeLastStr(const S, SubStr: String;
CaseCompare: TCaseCompare = ccCaseSensitive): String;
begin
 if IsLastStr(S, SubStr, CaseCompare) then
 begin
  Result := S;
 end else
 begin
  Result := S + SubStr;
 end;
end;

function IncludeBothEndsStr(const S, SubStr: String;
CaseCompare: TCaseCompare = ccCaseSensitive): String;
begin
 if S = '' then
 begin
  Result := SubStr + SubStr;
 end else
 begin
  Result := IncludeLastStr(IncludeFirstStr(S, SubStr, CaseCompare), SubStr, CaseCompare);
 end;
end;


function ExcludeFirstStr(const S, SubStr: String;
CaseCompare: TCaseCompare = ccCaseSensitive): String;
begin
 if IsFirstStr(S, SubStr, CaseCompare) then
 begin
  Result := DeleteStr(S, 1, Length(SubStr));
 end else
 begin
  Result := S;
 end;
end;

function ExcludeLastStr(const S, SubStr: String;
CaseCompare: TCaseCompare = ccCaseSensitive): String;
begin
 if IsLastStr(S, SubStr, CaseCompare) then
 begin
  Result := DeleteStr(S, Length(S)-Length(SubStr)+1, Length(SubStr));
 end else
 begin
  Result := S;
 end;
end;

function ExcludeBothEndsStr(const S, SubStr: String;
CaseCompare: TCaseCompare = ccCaseSensitive): String;
begin
 Result := ExcludeLastStr(ExcludeFirstStr(S, SubStr, CaseCompare), SubStr, CaseCompare);
end;

こんな風に実装しておくと、さまざまな場面で使うことができるので
手持ちのコードをライブラリ化しておくといいと思いますよ。

ま。久しぶりなんで、あっさり記事にしておきましょうか。
スポンサーサイト

| 未分類 | 12:48 | comments:2 | trackbacks(-) | TOP↑

COMMENT

CRLF は System.sLineBreak として定義されていたような……。

| | 2011/06/30 10:36 | URL | ≫ EDIT

sLineBreak だと、Linuxで定義が変わるんじゃなかったでしたっけ。

ConstUnitとして、いろいろ定義しておくとソースがすっきりして便利ですよ。

こんな感じかな。

EmptyStr = '';
CR = #$D; //#13
LF = #$A; //#10
TAB= #$9; //#9
NullStr = #$0;//#0
EN = '\';
CRLF = #$D#$A;//#13#10
Space = ' ';
ZenkakuSpace = ' ';

SingleQuote = '''';
DoubleQuote = '"';

Comma = ',';
Colon = ':';
SemiColon = ';';

| ミ・д・彡 | 2011/06/30 23:15 | URL | ≫ EDIT















非公開コメント

PREV | PAGE-SELECT | NEXT

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。