導入
メインフレームのバッチ処理やシステム間連携において、計算結果をファイルに出力したり、ログメッセージとして整形したりする機会は非常に多いものです。しかし、PL/Iで数値をそのまま文字列として扱おうとすると、型不一致エラーに悩まされることがあります。今回解説する組み込み関数「CHAR」は、数値をシンプルに文字列へ変換し、出力時のデータ整合性を保つために極めて重要な役割を果たします。
基礎知識
PL/Iにおける「CHAR」関数は、数値を文字データ(CHARACTER型)へと変換する関数です。JavaのString.valueOf()に近い機能ですが、メインフレーム特有の「固定長」という概念が強く関わっています。
数値から文字へ変換する際、単に値を変換するだけでなく、「変換後に何桁の領域を確保するか」を意識する必要があります。これを怠ると、意図しない桁埋め(パディング)が発生し、後続のプログラムでバグを引き起こす原因になります。
実装/解決策
CHAR関数の基本構文は「CHAR(変換対象, 長さ)」です。第2引数で指定した長さに満たない場合、結果は左詰めされ、右側が空白で埋められます。
ここで注意が必要なのは「符号」と「先行ゼロ」です。数値型から変換した場合、符号が文字列の一部として扱われるか、あるいは数値の先頭に空白やゼロがどのように配置されるかは、変換元の変数の属性に依存します。確実に制御したい場合は、この関数を通した後の編集も視野に入れることが大切です。
サンプルプログラム
以下に、数値変数を文字列に変換して出力する基本的なコード例を示します。
/ サンプルプログラム:数値から文字列への変換 /
TEST_CONV: PROC OPTIONS(MAIN);
DCL ACCOUNT_NUM FIXED DEC(10) INIT(12345); / 数値データ /
DCL STR_VAL CHAR(10); / 変換後の文字列用領域 /
/ ACCOUNT_NUMを10桁の文字列に変換して格納 /
STR_VAL = CHAR(ACCOUNT_NUM, 10);
/ 結果の確認用出力(PUT文を使用) /
PUT SKIP LIST(‘変換前(数値): ‘ || ACCOUNT_NUM);
PUT SKIP LIST(‘変換後(文字列): [‘ || STR_VAL || ‘]’);
END TEST_CONV;
応用・注意点
現場でよくある失敗として、変換後の文字列をファイルに出力する際、意図せず「先行ゼロ(Leading Zeros)」が残ってしまうケースがあります。CHAR関数はあくまで「プレーンな変換」を行うため、もし「ゼロを除去して右詰めしたい」といった高度な編集が必要な場合は、CHAR関数で変換した後に「TRIM」関数を併用するか、あるいは「EDIT」形式の出力処理を検討してください。また、負の数値が含まれる場合、符号の扱いが変換先の領域サイズに影響を与えないか、境界値テストを念入りに行うことを推奨します。

コメント