2024/10/03

@Text と Format

数値や日付データを文字列に変換する方法についてまとめます。特に書式を指定して変換する関数として、@関数では @Text、LotusScript では Format があります。これら関数は、使用頻度も高く便利なのですが、多機能な分、引数の指定が複雑です。ついついヘルプを見てしまう関数ですね。そこでよく使う変換をまとめておきます。


構文の確認

まずはそれぞれの関数の構文を確認します。

@関数の @Text は次の通りです。

   @Text( value ; format-string )

LotusScript の Format 関数は次の通りです。

   Format[$] ( expr [ , fmt ] )

引数の順は同じですね。どちらも 2 つ目の引数で変換する書式を文字列で指定する仕様となっています。今回はこの引数の指定方法についてまとめることになります。


数値の場合

数値を文字列に変換する際に行う処理としては、小数点以下の桁数をそろえる、3 桁ごとにカンマで区切る(カンマ編集)、一定の桁数に満たない場合 0 で埋める(ゼロ埋め)があります。それぞれ下記の通りです。

1234.567 という値の変換についてまとめました。

変換結果 @Text の書式 Format の書式 補足
1235 F0 0 整数のみ
1234.6 F1 0.0 少数 1 桁
1234.57 F2 0.00 少数 2 桁
1,234.6 F,1 #,##0.0 カンマ編集
01235 (なし) 00000 ゼロ埋め

@Text ではゼロ埋めする指定がないようなので、式で記述する必要がありそうです。

表示用の計算結果フィールドの式の例です。SourceNumber フィールドの値をゼロ埋めしています。xNumber に変換する値、xDigit に桁数を代入します。

   xNumber := SourceNumber;
   xDigit := 5;

   REM {エラー処理};
   @If(xNumber = ""; @Return(""); @Success);

   REM {指定した桁数でゼロ埋め};
   @Right(@Repeat("0"; xDigit) + @Text(xNumber; "F0"); xDigit)

なお、この式は桁あふれの場合、注意が必要です。例えば 1234567 の場合、"34567" となります。LotusScript の Format では "1234567" となります。


日付/時刻の場合

日付/時刻データでは、@関数と LotusScript で対比できるほど近しい指定が少ないので別々に記載します。

LotusScript の場合

Format 関数の引数の指定は単純です。年 月 日 時 分 秒 のそれぞれの英単語の頭文字を使って指定します。ただし、月 と 分 は同じ m となるため、分 では n を使用します。

また、1 文字ではゼロ埋めなし、2 文字でゼロ埋めとなります。これもわかりやすいですね。

例えば、2024/1/2 3:04:05 の場合、変換結果と引数の文字列は次のようになります。

変換結果 Format の書式 補足
1/2 m/d 月日(ゼロ埋めなし)
2024/01 yyyy/mm 年月(ゼロ埋め)
2024/01/02 yyyy/mm/dd 年月日(ゼロ埋め)
3:04 h:nn 時分(時はゼロ埋めなし)
3:04:05 h:nn:ss 時分秒(時はゼロ埋めなし)
2024/01/02 03:04:05 yyyy/mm/dd hh:nn:ss 年月日時分秒(ゼロ埋め)


@関数の場合

@Text 関数で日付/時刻値に対して指定できる記号は次のようなものがあります(抜粋)。

書式記号 補足
D0 年月日
D1 月日、現在の年でなければ年
D2 月日
D3 年月
T0 時分秒
T1 時分
S0 日付のみ
S1 時刻のみ
S2 日付と時刻
S3 日付と時刻(今日、昨日に限り文字で表示)

これらを組み合わせて指定すると希望する書式に変換できます。

変換結果 @Text の書式 補足
2024/01 D3S0 年月
2024/01/02 D0S0 年月日
03:04 T1S1 時分
2024/01/02 03:04:05 D0T0S2 年月日時分秒

@Text による変換の場合、必ずゼロ埋めになるようです。


@Text 仕様値の注意点

@Text を使用して日付を変換した場合、そのフォーマットは OS の日付の設定に依存します。例えば、日付(短い形式)を次の通り設定すると日付の区切り文字は ”-” となります。

次のように 月/日/年 の順にするとその順になってしまいます。

OS の設定に応じて結果も変わるところがポイントです。特に、グローバルな会社では注意が必要となりますね。


日付/時刻の変換

私はというとクライアント環境に依存して動作が変わることを避けたいので、@関数を使って日付値を文字列にする場合以下の式を使用しています。SourceDatetime が変換したい日付/時刻値が入ったフィールドです。

   xSrc := SourceDatetime;

   @If(xSrc = ""; @Return(""); @Success);

   REM {桁ごとに変換(不要な桁は削除)};
   xY := @Text(@Year(xSrc));
   xM := @Text(@Month(xSrc));
   xD := @Text(@Day(xSrc));
   xH := @Text(@Hour(xSrc));
   xN := @Right("0" + @Text(@Minute(xSrc)); 2);
   xS := @Right("0" + @Text(@Second(xSrc)); 2);


   REM {日付文字列を生成};
   xDate := @Implode(@Trim(xY:xM:xD); "/");
   xTime := @Implode(@Trim(xH:xN:xS); ":");

   @Implode(@Trim(xDate:xTime); " ");

赤字の部分がポイントです。年月日時分秒の各桁ごとに文字列で変換しています。0 埋めしたい場合は、分 や 秒のように @Right を使用しています。

もし、秒 が不要であれば xS の行を消すだけとなります。時刻が不要であれば、xH, xN, xS の行を消します。この操作だけで、後述の @Trim と @Implode がうまく調整してくれて、希望の文字列が出力されます。


0 件のコメント:

コメントを投稿