Как преобразовать буквенно-цифровую строку в десятичное число в языке COBOL - PullRequest
2 голосов
/ 28 марта 2010

Например, у меня есть буквенно-цифровая строка «ABCDEF 0 0,450», и мне нужно получить «0,450» в виде десятичного числа и выполнить арифметику. У нас есть способ? Пожалуйста, предложите.

Ответы [ 4 ]

3 голосов
/ 31 марта 2010

Я предполагаю, что формат не является фиксированным, так как тогда вы могли бы просто выбрать эту часть строки и переместить ее в поле, определенное с рис.

Предполагается, что строковое значение состоит из 3 частей, разделенных пробелами. Сначала определите несколько полей:

 1   part1       pic  x(14).
 1   part2       pic  x(14).
 1   part3       pic  x(07).

 1   digitsAn.
     2 digits    pic  9(03).
 1   decimalsAn.
     2 decimals  pic .9(03).

 1   theValue    pic  9(03)v9(3).

Суффикс взят из моего соглашения об именах и указывает буквенно-цифровое значение. Если строка ввода может быть длиннее, увеличьте размеры по мере необходимости.

Остальной код анализирует theString в theValue .

*    Extract the third part.
     initialize part3
     unstring theString delimited by all spaces into part1 part2 part3

*    make sure the receiving field contains numeric data.
     inspect part3 replacing spaces by zeroes

*    extract digits before and after the decimal point.
     unstring part3 delimited by "." into digits decimalsAn(2:)

*    Combine parts before and after decimal points into a numeric value.
     compute theValue = digits + decimals

Осторожно, я не запускал это через компилятор!

1 голос
/ 08 июня 2010

Например, у меня есть буквенно-цифровая строка «ABCDEF 0 0,450» и мне нужно получить '0.450' как десятичное число арифметика на нем. У нас есть способ? Пожалуйста, предложите.

Если вы работаете в CICS, вы можете использовать функцию BIF DEEDIT, которая оставит вас с "00.450".

Если вы не работаете в CICS, предположим, что ваша строка находится в поле с именем WS-STR:

Move 0 to JJ
Perform varying II from 1 by 1 
 until II > Length of WS-STR 

 Evaluate WS-STR (II:1)
   when '0'
   when '1'
   when '2'
   when '3'
   when '4'
   when '5'
   when '6'
   when '7'
   when '8'
   when '9'
   when '.'
     Add 1 to JJ
     Move WS-STR (II:1) to WS-NUM (JJ:1)

* ---- Do nothing
   when other
     continue

End-Perform
Compute REAL-DEC-NUM = Function NUM-VAL (WS-NUM)
1 голос
/ 14 мая 2010

В большинстве современных компиляторов Cobol вы можете переместить отредактированное числовое поле в числовое поле.

Заимствование из вашего примера ниже:

01 WS-NUM-STR           PIC X(14) VALUE 'ABCDEF 0 0.450'.
01 WS-NUM-STR-MOD       REDEFINES WS-NUM-STR.
   05 FILLER            PIC X(9).
   05 WS-EDITED-NUMBER  PIC 9.999.
01 WS-NUMBER            PIC 9V999.

----------

MOVE WS-EDITED-NUMBER TO WS-NUMBER

А затем выполните расчет с помощью WS-NUMBER.

1 голос
/ 31 марта 2010

Как правило, я мог бы найти способ достичь этого!

Как сказано выше, UNSTRING и объединение не работают, но REDEFINES работает!

Получить буквенно-цифровую строку, переопределенную в два числовых поля для хранения и обработки десятичной части и целой части по отдельности. Atlast разделите десятичную сумму на 1000 и добавьте ее к целочисленной части. Это оно! Фрагменты кода следуют ...

01 WS-NUM-STR      PIC X(14) VALUE 'ABCDEF 0 0.450'.
01 WS-NUM-STR-MOD  REDEFINES WS-NUM-STR.
   05 FILLER       PIC X(9).
   05 WS-INT-PART  PIC 9.
   05 FILLER       PIC X.
   05 WS-DEC-PART  PIC 999.

----------
----------

*  CODE TO ADD ALL INTEGER PARTS
*  CODE TO ADD ALL DECIMAL PARTS
   COMPUTE = INTEGER-TOTAL + (DECIMAL-TOTAL / 1000)

Примечание. Поскольку я уже знал, что десятичная часть состоит из 3 цифр, я разделил DECIMAL-TOTAL на 1000. Надеюсь, вы сможете выяснить.

И, пожалуйста, предложите любой другой способ добиться того же!

...