• ベストアンサー

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