• ベストアンサー

COBOLで文字タイプを数字タイプに変換する方法

すいませんコボル初心者の者です。周りに聞く人がいずに困っています。 アドバイスよろしくおねがします。 例えば、IN-SUNPO PIC X(7)に "0.25"や"0.025"と値が入っているとします。 この項目を OUT-SUNPO PIC 9(4)V9(3)にセットして出力したいのですが いい方法が考えつきません。 どのようにすれば実現するのでしょうか。 また、IN-TANAK PIC 9(8)をOUT-TANKA PIC X(10)に左詰でセットするために 入力項目の頭のゼロをどう処理していいかもわかりません。 考えても結論がでませんでしたので、投稿しました。 宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • youtakun
  • ベストアンサー率25% (1/4)
回答No.4

★ひとつ目の質問。 いろいろと特殊命令を使いますが簡単にコーディングできますし、覚えておくと便利です。 01 wk-seisu.  03 wk-seisu9 pic 9(4). 01 wk-syosu.  03 wk-syosu9 pic 9(3). *<< in-sunpo の空白を0に置き換える >> inspect in-sunpo replacing all " " by "0". *<< 「.」で判断して整数と少数に分ける >> unstring in-sunpo delimited by all "." into wk-seisu wk-syousu. *<< 分けた数字を合わせる >> compute in-sunpo = wk-seisu9 + (wk-syosu9 / 1000). ★ふたつ目は他の方が回答されているのと同じです。 *<< 符号(-)があるとき >> 01 wk-tanka.  03 wk-kanka9  pic -------9. *<< 符号(-)がないならこれでもいいです >> 01 wk-tanka.  03 wk-tanka9  pic zzzzzzz9. move in-tanta to wk-tanka9. move wk-tanka to out-tanka. お役に立つかちょっと不安ですが(^^;) コボル言語は他の言語と違って、ある程度法則を覚えると簡単です。 頑張ってくださいね。

その他の回答 (4)

  • youtakun
  • ベストアンサー率25% (1/4)
回答No.5

NO4の者です。 すみません、ちょっと間違えてました(><) *<< 「.」で判断して整数と少数に分ける >> unstring in-sunpo delimited by all "." into wk-seisu wk-syousu. ↓ unstring in-sunpo delimited by all "." into wk-seisu9 wk-syousu. でした。お恥ずかしい・・・(///)

hidekin
質問者

お礼

すばらしいです。 ありがとうございます。 サブルーチンの存在を発見したのですが、 こんなに簡単にできるとは。 大変勉強になりました。 ありがとうございました。

回答No.3

"0.25"、"0.025"が、必ず右詰め? 整数部の桁は変動? ということで、整数部と小数部を分解して、編集後、セットするというのはどうでしょう? 01 IN-SUNPO PIC X(7). 01 OUT-SUNPO PIC 9(4)V9(3). 01 WORK-AREA. 05 WIN-SUNPO-TBL. 10 WIN-SUNPO OCCURS 7 TIMES PIC X(1). * 05 WIN-SEISU-TBL. 10 WIN-SEISU OCCURS 7 TIMES PIC X(1). 05 WIN-SHOSU-TBL. 10 WIN-SHOSU OCCURS 7 TIMES PIC X(1). 05 WIN-SEISU2-TBL. 10 WIN-SEISU2 OCCURS 7 TIMES PIC X(1). 05 WIN-SEISU2-TBL-R REDEFINES WIN-SEISU2-TBL. 10 WIN-SEISU2-R PIC 9(7). 05 WIN-SHOSU-TBL-R REDEFINES WIN-SHOSU-TBL. 10 WIN-SHOSU-R PIC 9(7). * 05 WOU-SUNPO 9(7)V9(7). 05 WOU-SUNPO-R REDEFINES WOU-SUNPO. 10 WOU-SEISU-R 9(7). 10 WOU-SHOSU-R 9(7). * 01 IXA PIC 9(1) VALUE 0. 01 IXB PIC 9(1) VALUE 0. 01 IXC PIC 9(1) VALUE 0 01 IXD PIC 9(1) VALUE 0. MOVE IN-SUNPO TO WIN-SUNPO-TBL. MOVE ZERO TO IXB,IXC,IXD,IXE. *整数部セット PERFORM VARYING IXA FROM 1 BY 1 UNTIL IXA > 7 EVALUATE WIN-SUNPO(IXA) WHEN " " CONTINUE WHEN "." COMPUTE IXC = IXA - 1 MOVE IXA TO 9 WHEN OTHER ADD 1 TO IXB MOVE WIN-SUNPO(IXA) TO WIN-SEISU(IXB) END-EVALUATE END-PERFORM. *整数部右詰めセット MOVE 8 TO IXB. PERFORM VARYING IXA FROM 7 BY -1 UNTIL IXA < 1 IF WIN-SEISU(IXA) = SPACE THEN CONTINUE ELSE SUBTRCT 1 FROM IXB MOVE WIN-SEISU(IXA) TO WIN-SEISU2 END-IF END-PERFORM. INSPECT WIN-SEISU2-TBL LEADING " " BY "0". MOVE WIN-SEISU2-R TO WOU-SEISU-R. *小数部セット PERFORM VARYING IXD FROM IXC BY 1 UNTIL IXD > 7 EVALUATE WIN-SUNPO(IXD) WHEN " " CONTINUE WHEN OTHER ADD 1 TO IXE MOVE WIN-SUNPO(IXD) TO WIN-SHOSU(IXE) END-EVALUATE END-PERFORM. INSPECT WIN-SHOSU-TBL LEADING " " BY "0". MOVE WIN-SHOSU-R TO WOU-SHOSU-R. * MOVE WOU-SUNPO TO OUT-SUNPO.

hidekin
質問者

お礼

アドバイスありがとうございました。 いろいろ資料をあせっていたら、サブルーチンが ありました。 内容はアドバイスされたようなものでした。 勉強になりました。ありがとうございました。

  • 20020718
  • ベストアンサー率48% (13/27)
回答No.2

こちらで確認が出来ないので、憶測ですが。。。 01 OUT-SUNPO-X. 03 OUT-SUNPO PIC 9(4)V9(3). と定義し、 MOVE IN-SUNPO TO OUT-SUNPO-X. で、代入後、 OUT-SUNPO を使用してはいかがでしょう。。。 01 IN-TANAK PIC --------9. 01 OUT-TANKA REDEFINES IN-TANAK PIC X(10). とかでも出来たはずですが。。。 以下URLを参考になさって、実際に動かしてみて下さい。

参考URL:
http://hp.vector.co.jp/authors/VA003991/kouza/kouza_cobol.html
hidekin
質問者

お礼

明日、やってみます。 結果ご報告いたします。ありがとうございました。

  • kz2960
  • ベストアンサー率21% (33/154)
回答No.1

まず、PIC XからPIC 9にはMOVEが出来ません。(逆は可能)そこで簡単なサブルーチンを作成してはどうでしょうか。COBOL言語が数年行ってないので考えかたでよろしいでしょうか? Basic 形式で記載でごめんなさい! for i=1 to 7 if IN-SUNPO(i:1)="." THEN n = i break end-if next i OUT_SUNPO = 0 for i=n-1 to 1 setp -1 select case IN-SUNPO(i:1) case "0" OUT_SUNPO = OUT_SUNPO + (0 * 10^(i-n)) 残り9まで同様 next 負も同じ考えでn+1から7桁で処理 これで駄目ですか? 帰宅して時間があってらCOBOLのマニュアル読んで再度更新!(予定)

hidekin
質問者

お礼

帰宅してからも・・・。本当にありがとうございます。 感謝です。 本日は解決せずに、帰宅しました。 今、自宅で拝見させていただきました。 明日、実行してみます。 結果ご報告いたします。ありがとうございました。

関連するQ&A

  • COBOL FILLER

    COBOLのFILLER項目の出力を質問させていただきます。 質問1 OUT1-FILE. 01 OUT-REC  02 FILLER PIC X(10). このファイルを何もせず WRITE で出力した場合は空ファイルが出力されますか?それとも"0000000000"が出力されますか? 質問2 またこのファイルをINITHILIZEした後WRITEでファイル出力したら何が出力されますか? 質問3 このファイルをMOVE ZERO TO OUT-REC した後WRITEでファイル出力したら何が出力されますか?

  • COBOLについて

    COBOL初心者なのですが。 COBOLで 01 A.   03 B PIC 9(02).   03 C PIC X(02). MOVE  SPACE  TO  A. とした時、基本項目であるBには何が入っているのでしょうか? 数字項目にSPACEというのはありえないですよね。 どなたかわかる方、教えていただけませんか?

  • COBOLで変数が何文字で宣言されたかを取得する方法

    COBOLで、例えば 01 IN-REC. 02 IN-BANGO PIC X(05). 02 IN-SHIMEI PIC X(15). …(100個続く)… 02 IN-CLASS PIC X(10). 02 IN-SEISEKI. 03 IN-SUGAKU PIC 9(03). 03 IN-EIGO PIC 9(03). …(続く)… 03 IN-KOKUGO PIC 9(03). となっていたとします。このとき、プログラム中で IN-RECが何文字で宣言されているかを上の宣言文の各変数の文字数を いちいち計算機か暗算で足し算していく以外に関数みたいな形で 知る方法はないでしょうか? また、ないなら、それを計算するマクロを自力で作るにはどうしたら よいのでしょうか?

  • pro*cobol ⇔ oracle のデータ型の扱い

    お世話になります。 pro*cobolで、テーブルの作業領域を定義し、 データの編集後、oracleのテーブルへ出力している のですが、cobol側の定義はpic9タイプで oracleの項目定義ではCHAR型になっております。 この状態で、cobol側のpic9タイプの項目に "A00001"等文字を含む値を設定した所、 ABENDせずにoracleテーブルに"A00001"の 項目値を出力しています。 cobolだけに限れば、属性エラーなのですが、 この場合、oracleの項目定義が優先されるのでしょうか? よろしくご教授の程、お願い申し上げます。

  • COBOLの条件式について

    以下のような構文があります。 ループ中にAに1234の値、Bに1234の値がセットされていますが、 ループを抜けません。どうしてでしょうか? なお、データ項目A,BのサイズをX(4)にすると、抜けます。 01 A PIC X(5) 01 B PIC X(5)    : PERFORM UNTIL A = B    : END-PERFORM

  • COBOL

    COBOLから.NETへ移す作業をしております。 以下の点で詰まりました。 1、pic X(03) COLUMN 7. このうち、COLUMNは何をしているのでしょうか? 調べてもわかりませんでした。 2、 MOVE ZEROとイニシャライズの違いについて MOVE R-TBL TO ZEROとINITIALIZE R-TBL 実際に何が違うのでしょうか? R-TBL内にname pic X(08)という変数と number pic 9(2)という変数があったとすると ZEROの方は name⇒"00000000" で number⇒0 INITHLIZEの方は name⇒""  で number ⇒ 0 でしょうか? 3、HIGH-VALUEについて HIGH-VALUEが取りうる最大値を表すことはわかりました。 VBでもC#でもchar.MAXVALUEみたいに取れます。 name pic X(10)にHIGH-VALUEを入れるとすると.NETで実現しようとすると string name = char.MAXVALUEとなります。 これを 01 R-TBL. 02 box PIC 9(5). 02 id PIC 9(5). に代入したいのですがうまく出来ません。 どうすればよいのでしょうか?

  • COBOLについて

    今高校でCOBOLの勉強をしています。 教科書の練習問題が宿題に出されたのですが、わからないところがありました。 (1)数字項目2桁、テーブル名SUUJI-TBL、データ名SUUJI、要素数20個のテーブルを確保しなさい。 (2)手続き部で、(1)で確保したテーブルに、先頭から1,3,5・・・の値を転記しなさい。ただし、PERFORM文を用いること。 という問題です。 (1)は、 01 SUUJI-TBL.   02 SUUJI PIC X(2) OCCURS 20. と書けたのですが、(2)がさっぱりわかりません。 わかる方、教えてもらえますか?

  • COBOLで全角変換を行いたいのですが...

    汎用機(ACOS-4)でCOBOLを使って開発を行っている者です。 INファイルのある項目を全角変換し、 OUTファイルに出力するプログラムを作成しています。 ただ困った事に変換元の項目の内容が 半角のデータ、全角のデータ、半角全角が混在しているデータもあるのです。 現在は項目の中に半角スペースの文字コードが存在すれば全て半角とし、 以外は全て全角と判断しています。 もちろん項目中のデータが全て埋まっている場合や、 半角全角が混在しているデータについては文字化けを起こしています。 どなたかこのような変換について良い方法があればご教授願います。 宜しくお願い致します。

  • COBOLでの可変長定義について

    unix環境下でCOBOL85を使用しています。 あるデータを可変長でWRITEしていくのですが、 データにヘッダー情報みたいなものが付加されてしまい困っています。 ヘッダー情報を付加しないようにするにはどうすればいいのでしょうか? 定義:  FD Aファイル RECORD IS VARYING 1 TO 100 DEPENDING ON A-CNT.  01 A-DATA PIC X(100). とか  FD Aファイル RECORD IS VARYING IN SIZE DEPENDING ON A-CNT.  01 A-DATA PIC X(100). というパターンで試しています。 Aファイルにaaaという3バイトデータをWRITEすると、 COBOL85020315020304・・・・・aaaというデータが出力されます。 あるコボラーに聞くと「定義がおかしいからでしょう」と言ってたのですが、 どうおかしいかは本人もわからないようです。 どうすればヘッダー情報(COBOL85020315020304・・・・・)がつかず、 可変長でWRITEできるのでしょうか?教えて下さい。

  • PRO COBOLでFETCH時に値を変換する

    PRO COBOLでoracleデータを読み込むプログラムを変更しようとしています。 元のプログラムは、 ----------------------------- WORKING-STORAGE SECTION. EXEC SQL DECLARE table10c CURSOR FOR SELECT table10.item11, table10.item12 FROM table10,table20 WHERE table10.item13 = table20.item23 END-EXEC --- PROCEDURE DIVISION. EXEC SQL FETCH table10c INTO file-item11, ←出力ファイルの項目1 file-item12 ←出力ファイルの項目2 END-EXEC. ----------------------------- となっていて、item13 と等しい値が table20.item23 にある場合 item11 と item12 の値を順次、ファイルに出力しています。 今回、仕様を変更し、item11の値を変換してファイルに 出力しようとしています。 変換する値は、テーブル:henkan に登録しています。 項目1:old-item ・・・table10.item11にセットしている値 項目2:new-item ・・・file-item11にセットしたい値 WHERE句の条件は、そのままです。 (WHERE table10.item13 = table20.item23) 但し、item11の値は全て変換するわけではなく、 テーブル:henkan に一致するレコードが有る場合のみ つまり table10.item11 = henkan.old-item の場合のみ file-item11 に henkan.new-item の値を出力し、 それ以外の場合には、table10.item11 の値をセットします。 この変更を極力少ないロジックの改修で済ませたく 基本的には 「DECLARE table10c CURSOR」句の変更と したいです。 「SELECT table10.item11,」の項目を変数にして 変換した場合は、henkan.new-item の値をセットし 変換しない場合には、table10.item11 の値をセットできれば 良いのではないかと思っていますが具体的な方法が判りません。 同様の変更を(出力条件等の異なる)複数のプログラムに 行うつもりで「PROCEDURE DIVISION」は、複雑になっているため 変更は最小限としたいです。 PRO COBOLの経験が少なく、アドバイスをお願いします。