組み込み関数を使用することによって、文字ストリング・データ項目を次のものに変換できます。
NATIONAL-OF および DISPLAY-OF 組み込み関数を使用すると、国別 (Unicode) ストリングとの間で相互に変換することができます。
ストリングから先頭または末尾 (あるいはその両方の) 文字を除去するには、TRIM、TRIML、TRIMR 組み込み関数を使用します。
組み込み関数で文字変換を行うほかに、INSPECT ステートメントも使用できます。
以下のコーディングの場合、
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 の実際の内容に移動します。
以下のコードは、
MOVE FUNCTION REVERSE(ORIG-CUST-NAME) TO ORIG-CUST-NAME.
ORIG-CUST-NAME の文字の順序を逆にします。 たとえば、開始値が JOHNSON であれば、ステートメントの実行後に NOSNHOJ になります。
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 を使用すると、数字データを固定形式で静的に宣言したり、入力データを正確に宣言したりする必要がありません。 たとえば、次のコーディングの場合、
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 関数は、英数字、数字、または日時項目を受けとり、それを日時データ項目に変換します。 組み込み関数を使用して、次のことが行えます。
たとえば、以下のステートメントは、非数値リテラル (英数字定数) をカテゴリー日付データ項目へ変換します。
MOVE FUNCTION CONVERT-DATE-TIME ('98/08/09' DATE '%y/%m/%d') TO DATE-1.
変換は、日付が含まれている数値データ項目を日時データ項目に比較または移動する際にも発生します。 これらのタイプの移動に関する考慮事項については 日時データ項目の MOVE に関する考慮事項を参照してください。
日付を含む英数字データ項目を日時データ項目へ移動する際には、変換は行われません。 英数字データ項目に含まれている文字はすべて、日時データ項目へ移動されます。 英数字データ項目に含まれている日付を日時データ項目へ移動される前に正しい形式にするのは、 プログラマーの責任において行ってください。
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 の項目を Unicode (UCS-2) で表現される文字ストリングに変換するには、NATIONAL-OF 組み込み関数を使用します。 ソースが、CCSID コンパイラー・オプションによって有効になっているものとは 異なるコード・ページでエンコードされている場合、ソース・コード・ページを 引数として指定します。
引数として指定したコード・ページ、または 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 関数は、ブランクまたは指定された文字をストリングから除去します。たとえば、
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
(C) Copyright IBM Corporation 1992, 2006. All Rights Reserved.