データ項目の変換 (組み込み関数)

組み込み関数を使用することによって、文字ストリング・データ項目を次のものに変換できます。

NATIONAL-OF および DISPLAY-OF 組み込み関数を使用すると、国別 (Unicode) ストリングとの間で相互に変換することができます。

ストリングから先頭または末尾 (あるいはその両方の) 文字を除去するには、TRIM、TRIML、TRIMR 組み込み関数を使用します。

組み込み関数で文字変換を行うほかに、INSPECT ステートメントも使用できます。

大文字または小文字への変換 (UPPER-CASE、LOWER-CASE)

以下のコーディングの場合、

01 ITEM-1               PIC X(30)     VALUE "Hello World!".
01 ITEM-2               PIC X(30).
   .
   .
   .
   DISPLAY ITEM-1.
   DISPLAY FUNCTION UPPER-CASE(ITEM-1).
   DISPLAY FUNCTION LOWER-CASE(ITEM-1).
   MOVE FUNCTION UPPER-CASE(ITEM-1) TO ITEM-2.
   DISPLAY ITEM-2.

次のメッセージを端末に表示します。

Hello World!
HELLO WORLD!
hello world!
HELLO WORLD!

DISPLAY ステートメントは、ITEM-1 の実際の内容を変更することなく、文字の表示方法だけに影響します。 しかし、MOVE ステートメントは大文字を ITEM-2 の実際の内容に移動します。

逆順への変換 (REVERSE)

以下のコードは、

   
   MOVE FUNCTION REVERSE(ORIG-CUST-NAME) TO ORIG-CUST-NAME.

ORIG-CUST-NAME の文字の順序を逆にします。 たとえば、開始値が JOHNSON であれば、ステートメントの実行後に NOSNHOJ になります。

数値への変換 (NUMVAL、NUMVAL-C)

NUMVAL 関数および NUMVAL-C 関数は、文字ストリングを数値に変換します。 これらの関数は、フリー・フォーマット文字表記を含んだ英数字データ項目を数値形式に変換し、それらを数値的に処理するのに使用します。 たとえば、

01 R            PIC X(20)   VALUE "- 1234.5678".
01 S            PIC X(20)   VALUE "-$12,345.67CR".
01 TOTAL        USAGE IS COMP-2.
   .
   .
   .
   COMPUTE TOTAL = FUNCTION NUMVAL(R) + FUNCTION NUMVAL-C(S).

NUMVAL と NUMVAL-C との違いは、例にも見られるように、 引き数に通貨記号やコンマが含まれる場合には NUMVAL-C を使用するという点です。 先頭または末尾に代数符号を付けても、問題なく処理されます。 引き数は、18 桁以下 (ただし、編集記号は含みません) にする必要があります。 正確な構文規則については、「WebSphere Development Studio: ILE COBOL 解説書」を参照してください。

注:
NUMVAL も NUMVAL-C も、長精度 (倍精度) 浮動小数点値を戻します。 したがって、これらのいずれかの関数への参照は、数字データ項目への参照になります。
NUMVAL および NUMVAL-C を使用する理由

NUMVAL や NUMVAL-C を使用すると、数字データを固定形式で静的に宣言したり、入力データを正確に宣言したりする必要がありません。 たとえば、次のコーディングの場合、

   
   01 X         PIC S999V99   LEADING SIGN IS SEPARATE.
   .
   .
   .
   ACCEPT X FROM CONSOLE.

アプリケーションのユーザーは、数値の入力を PICTURE 文節の定義どおり正確に行う必要があります。 たとえば、

+001.23
-300.00

しかし、NUMVAL 関数を使用する場合は、次のようにコーディングできます。

   
   01 A         PIC X(10).
   01 B         PIC S999V99.
   .
   .
   .
   ACCEPT A FROM CONSOLE.
   COMPUTE B = FUNCTION NUMVAL(A).

以下のように入力することができます。

1.23
-300

日時データ項目への変換 (CONVERT-DATE-TIME)

CONVERT-DATE-TIME 関数は、英数字、数字、または日時項目を受けとり、それを日時データ項目に変換します。 組み込み関数を使用して、次のことが行えます。

たとえば、以下のステートメントは、非数値リテラル (英数字定数) をカテゴリー日付データ項目へ変換します。

MOVE FUNCTION CONVERT-DATE-TIME ('98/08/09' DATE '%y/%m/%d')
     TO DATE-1.

変換は、日付が含まれている数値データ項目を日時データ項目に比較または移動する際にも発生します。 これらのタイプの移動に関する考慮事項については 日時データ項目の MOVE に関する考慮事項を参照してください。

日付を含む英数字データ項目を日時データ項目へ移動する際には、変換は行われません。 英数字データ項目に含まれている文字はすべて、日時データ項目へ移動されます。 英数字データ項目に含まれている日付を日時データ項目へ移動される前に正しい形式にするのは、 プログラマーの責任において行ってください。

UTF-8 (UTF8STRING) への変換

UTF8STRING 関数は、文字ストリングを UTF-8 (UCS Transformation Format 8) に変換します。UTF-8 コード化形式は、CCSID 1208 によって表されます。たとえば、次のとおりです。

01 STR1 PIC X(3) VALUE "ABC". 
01 VRR-X3 PIC X(3).
.
.
.
MOVE FUNCTION UTF8STRING(STR1) TO VRR-X3.

VRR-X3 の内容は X"414243" になります。

英数字または DBCS から国別データへの変換 (NATIONAL-OF)

英字、英数字、または DBCS の項目を Unicode (UCS-2) で表現される文字ストリングに変換するには、NATIONAL-OF 組み込み関数を使用します。 ソースが、CCSID コンパイラー・オプションによって有効になっているものとは 異なるコード・ページでエンコードされている場合、ソース・コード・ページを 引数として指定します。

国別データから英数字または DBCS データへの変換 (DISPLAY-OF)

引数として指定したコード・ページ、または CCSID コンパイラー・オプションを使用して指定したコード・ページで表される文字ストリングに国別項目を変換するには、DISPLAY-OF 組み込み関数を使用します。 SBCS と DBCS を結合している EBCDIC コードを指定した場合、戻されるストリングには SBCS 文字と DBCS 文字が混在している場合があります。 この場合、DBCS サブストリングは、シフトインおよびシフトアウト文字で区切られます。

デフォルトのコード・ページの指定変更

場合によっては、CCSID オプション値として指定された CCSID とは異なる CCSID との間でデータを相互に変換する必要が生じることもあります。 これを行うには、変換関数を使用し、この関数でその項目のコード・ページを明示的に指定します。

CCSID コンパイラー・オプションで指定したコード・ページとは異なるコード・ページを DISPLAY-OF の引数として指定した場合は、 暗黙の変換を伴う操作 (国別データ項目との間の割当や比較など) には DISPLAY-OF 関数の結果を使用しないでください。 そのような操作では、EBCDIC コード・ページは CCSID コンパイラー・オプションで指定されていることを想定しています。

変換の例外

国別データと英数字データとの暗黙的または明示的変換が失敗した場合、重大度 40 のエラーが生成されることがあります。 このエラーは、以下のいずれかに起因する可能性があります。

ターゲットの CCSID に対応するものがない文字は、変換例外にはなりません。 そのような文字は、ターゲットのコード・ページの置換文字に変換されます。

次の例は、NATIONAL-OF および DISPLAY-OF 組み込み関数を使用して、Unicode ストリングとの間で変換を行う方法を示しています。 またこの例は、同一のプログラムで、複数のコード・ページでエンコードされたストリングを操作するときには、明示的な変換が必要であることも示しています。

	 PROCESS CCSID(37) 
	*... 
	 01  Data-in-Unicode pic N(100) usage national. 
	 01  Data-in-Greek pic X(100). 
	 01  other-data-in-US-English pic X(12) value "PRICE in $=". 
	*... 
	     Read Greek-file into Data-in-Greek 
	     Move function National-of(Data-in-Greek, 00875) 
	         to Data-in-Unicode 
	*...process Data-in-Unicode here ... 
	     Move function Display-of(Data-in-Unicode, 00875) 
	         to Data-in-Greek 
	     Write Greek-record from Data-in-Greek 

上の例は、正常に動作します。Data-in-Greek は、CCSID 00875 (ギリシャ語) で明示的に表されるデータとして変換されます。 ただし、(項目内のすべての文字が、ギリシャ語と英語のコード・ページ内に共通の表記を持つ文字の中にない限り) 次のステートメントは誤変換になります。

	Move Data-in-Greek to Data-in-Unicode  

Data-in-Greek は、CCSID 00037 (U.S. English) から UCS-2 への変換に基づいて、MOVE ステートメントによって Unicode に変換されます。 Data-in-Greek は実際には CCSID 00875 でエンコードされているので、この変換は失敗します。

CCSID コンパイラー・オプションを正しく CCSID 00875 に設定できる場合 (すなわち、プログラムの残りの部分も EBCDIC データをギリシャ語で処理している場合)、上の例は以下のように正しくコーディングすることができます。

	 PROCESS CCSID(00875) 
	*... 
	 01  Data-in-Unicode pic N(100) usage national. 
	 01  Data-in-Greek pic X(100). 
	     Read Greek-file into Data-in-Greek 
	*... process Data-in-Greek here ... 
	*... or do the following (if need to process data in Unicode) 
	     Move Data-in-Greek to Data-in-Unicode 
	*... process Data-in-Unicode 
	     Move function Display-of(Data-in-Unicode) to Data-in-Greek 
	     Write Greek-record from Data-in-Greek

先頭または末尾 (あるいはその両方) の文字の除去 (TRIM、TRIML、TRIMR)

TRIM、TRIML、TRIMR 関数は、ブランクまたは指定された文字をストリングから除去します。たとえば、

	01 ADDR. 
	  05 STREET-NO  PIC X(5)  VALUE "120". 
	  05 STEET-NAME PIC X(50) VALUE "Young Street". 
	  05 CITY       PIC X(20) VALUE "Toronto". 
	  05 STATE      PIC X(15) VALUE "Ontario". 
	  05 ZIP        PIC X(6)  VALUE "M1C5D9". 
	01 ADDRESS-LINE PIC X(80). 
	    STRING FUNCTION TRIM(STREET-NO) " "  
	           FUNCTION TRIM(STREET-NAME) ", "  
	           FUNCTION TRIM(CITY) ", " FUNCTION TRIM(STATE) " " 
	           FUNCTION TRIM(ZIP) DELIMITED BY SIZE  
	           INTO ADDRESS-LINE.  
	    DISPLAY ADDRESS-LINE. 

この出力は、以下のようになります。

	120 Young Street, Toronto, Ontario M1C5D9