Как преобразовать целочисленное значение в десятичное значение в COBOL?Как преобразовать целочисленное значение в десятичное значение в COBOL
мне нужно отобразить 1234567 в 12345,67
Я не могу разделить переменную на 100.
Как преобразовать целочисленное значение в десятичное значение в COBOL?Как преобразовать целочисленное значение в десятичное значение в COBOL
мне нужно отобразить 1234567 в 12345,67
Я не могу разделить переменную на 100.
Пересмотрите ваше значение с помощью десятичной подразумеваемых. НАПРИМЕР.
10 ws-integer pic 9(7) value 1234567.
10 ws-decimal redefines ws-integer pic 9(5)v99.
Когда вы будете называть это как ws-decimal, вы получите 12345.67.
Итак, если вы переместите что-то в ws-целое, вы можете получить к нему доступ с десятичными знаками в правильном положении, используя другое поле.
COBOL предоставляет несколько числовых изображений. Некоторые облегчают арифметические операции , другие облегчают презентацию. Требуется в то время, чтобы отсортировать их все.
Я думаю, вы можете искать подразумеваемое десятичное представление. Подразумевается десятичной обозначено буквой «V» в строке PICTURE, например:
WS-INT-NBR PIC 9(7).
WS-DEC-NBR PIC 9(5)V99.
Оба указанных выше деклараций содержит 7 цифр и занимают 7 байт памяти. Вы можете присвоить значение 1234567 для WS-INT-NBR следующим образом:
MOVE 1234567 TO WS-INT-NBR
но делать то же самое с WS-DEC-НБР будет вызвать переполнение (усечение), поскольку он может содержать только 5 цифр перед тем подразумеваемая десятичная точка («V»). Однако, если вы должны были сделать следующее:
MOVE 12345.67 TO WS-DEC-NBR
фактическое содержание WS-DEC-НБР будет 1234567
(обратите внимание на десятичную точку исчезает, и он содержит значение, эквивалентное WS-INT-NBR). Это то, что подразумевается под подразумеваемой десятичной точкой . COBOL «знает», что WS-DEC-NBR имеет десятичную точку между 5-й и 6-й цифрами, но на самом деле не сохраняет ее. Любые применяемые операции на WS-DEC-NBR учитывают подразумеваемую десятичную точку.
Вооруженный этими знаниями, вы можете использовать другую функцию COBOL, объявление REDEFINES. REDEFINES сообщает компилятору применить различные правила обработки данных к той же самой области хранения. В одном случае вы хотите, чтобы обрабатывал область памяти как целое число: PIC 9 (7); и в других случаях, таких как подразумеваемое десятичное значение : PIC 9 (5) V99). ли это следующим образом:
01.
02 WS-INT-NBR PIC 9(7).
02 WS-DEC-NBR REDEFINES WS-INT-NBR PIC 9(5)V99.
Теперь WS-INT-NBR и WS-DEC-NBR занимают ту же область памяти (те же 7 байт). Однако , когда вы ссылаетесь на WS-INT-NBR, используется целочисленное представление. Когда вы ссылаетесь на WS-DEC-NBR, используется десятичное представление .
Это дает нам возможность «не делить на 100» часть вашей проблемы.Следующий бит - , отображающий десятичную точку, когда вам нужно. COBOL предоставляет форматы DISPLAY, содержащие явную «пунктуацию», для которой десятичная точка равна единице. Например:
01 WS-DEC-DISPLAY PIC 9(5).99.
WS-DEC-DISPLAY содержит явную десятичную точку в пределах своей статьи PICTURE (не путать период в конце строки с вложенным п PICture десятичной точкой). Содержимое WS-DEC-DISPLAY содержит явную десятичную точку. Таким образом, чтобы получить десятичную точки для отображения вам нужно переместить что-то с подразумеваемой десятичной точкой для него, как и в:
MOVE WS-DEC-NBR TO WS-DEC-DISPLAY
если WS-DEC-NBR содержал «1234567», WS-DEC-DISPLAY будет после «MOVE» введите «12345.67».
Следующая программа и отображает все это вместе для вас:
IDENTIFICATION DIVISION.
PROGRAM-ID. EXAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
01.
02 WS-INT-NBR PIC 9(7).
02 WS-DEC-NBR REDEFINES WS-INT-NBR PIC 9(5)V99.
01 WS-DEC-DISPLAY PIC 9(5).99.
PROCEDURE DIVISION.
MOVE 1234567 TO WS-INT-NBR
MOVE WS-DEC-NBR TO WS-DEC-DISPLAY
DISPLAY 'WS-INT-NBR : ' WS-INT-NBR
DISPLAY 'WS-DEC-NBR : ' WS-DEC-NBR
DISPLAY 'WS-DEC-DISPLAY: ' WS-DEC-DISPLAY
ADD +1 TO WS-INT-NBR
MOVE WS-DEC-NBR TO WS-DEC-DISPLAY
DISPLAY 'INT-NBR PLUS 1: ' WS-DEC-DISPLAY
ADD +1 TO WS-DEC-NBR
MOVE WS-DEC-NBR TO WS-DEC-DISPLAY
DISPLAY 'DEC-NBR PLUS 1: ' WS-DEC-DISPLAY
GOBACK
.
Выход:
WS-INT-NBR : 1234567
WS-DEC-NBR : 1234567
WS-DEC-DISPLAY: 12345.67
INT-NBR PLUS 1: 12345.68 <= notice which digit incremented
DEC-NBR PLUS 1: 12346.68 <= notice which digit incremented
Thats достойное объяснение NealB. 'Ненавидит ваше терпение' –
я пробовал, однако после того, как делать это им получать юдоль, как 34567,00 – user1053713
Вы должны делать «Переместить ws-integer в ws-decimal» вам нужно переопределить область данных. –