Story:
On Mars there exists a company, lets name this company Martion.
This company has an issue with some of their data, you are hired to solve the following issue.
The issue is comming from a larger input than the output, it is more work to change the output field (this impacts thousands of programs), this is why a new function must be build to get the correct data into the output field without changing the output field size.
Scenario:
Input =
EX-RATE-I
Output =
EX-RATE-O
AMT-DECIMALS
ERR-FIELD
Assignment:
Move input EX-RATE to Output EX-RATE and determine how many DECIMALS are moved to Output and note them in AMT-DECIMALS. (Pre decimal numbers are leading)
If Input EX-RATE does not fit into Output EX-RATE, move "Error" to ERR-FIELD - NOTE: it is allowed to round the decimals if possible ( You are expected to do this ).
123456*8901
IDENTIFICATION DIVISION.
PROGRAM-ID. Sqeezing.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 EX-RATE-I PIC S9(10)V9(08).
01 EX-RATE-O PIC 9(09).
01 AMT-DECIMALS PIC 9(01).
01 ERR-FIELD PIC X(5).
01 POINTER1 PIC 9(02).
01 AMT-PRE-DECI PIC 9(02).
01 WHOLE-NB PIC 9(02).
PROCEDURE DIVISION.
GOBACK.
R000-SQEEZE SECTION.
EVALUATE TRUE
WHEN EX-RATE-I (1:10) = '0000000000'
MOVE 0 TO AMT-PRE-DECI
MOVE 11 TO POINTER1
WHEN EX-RATE-I (1:9) = '000000000'
MOVE 1 TO AMT-PRE-DECI
MOVE 10 TO POINTER1
WHEN EX-RATE-I (1:8) = '00000000'
MOVE 2 TO AMT-PRE-DECI
MOVE 9 TO POINTER1
WHEN EX-RATE-I (1:7) = '0000000'
MOVE 3 TO AMT-PRE-DECI
MOVE 8 TO POINTER1
WHEN EX-RATE-I (1:6) = '000000'
MOVE 4 TO AMT-PRE-DECI
MOVE 7 TO POINTER1
WHEN EX-RATE-I (1:5) = '00000'
MOVE 5 TO AMT-PRE-DECI
MOVE 6 TO POINTER1
WHEN EX-RATE-I (1:4) = '0000'
MOVE 6 TO AMT-PRE-DECI
MOVE 5 TO POINTER1
WHEN EX-RATE-I (1:3) = '000'
MOVE 7 TO AMT-PRE-DECI
MOVE 4 TO POINTER1
WHEN EX-RATE-I (1:2) = '00'
MOVE 8 TO AMT-PRE-DECI
MOVE 3 TO POINTER1
WHEN EX-RATE-I (1:1) = '0'
MOVE 9 TO AMT-PRE-DECI
MOVE 2 TO POINTER1
WHEN OTHER
MOVE 10 TO AMT-PRE-DECI
MOVE 1 TO POINTER1
END-EVALUATE
EVALUATE TRUE
WHEN EX-RATE-I(11:8) = '00000000'
MOVE 0 TO AMT-DECIMALS
WHEN EX-RATE-I(12:7) = '0000000'
MOVE 1 TO AMT-DECIMALS
WHEN EX-RATE-I(13:6) = '000000'
MOVE 2 TO AMT-DECIMALS
WHEN EX-RATE-I(14:5) = '00000'
MOVE 3 TO AMT-DECIMALS
WHEN EX-RATE-I(15:4) = '0000'
MOVE 4 TO AMT-DECIMALS
WHEN EX-RATE-I(16:3) = '000'
MOVE 5 TO AMT-DECIMALS
WHEN EX-RATE-I(17:2) = '00'
MOVE 6 TO AMT-DECIMALS
WHEN EX-RATE-I(18:1) = '0'
MOVE 7 TO AMT-DECIMALS
WHEN OTHER
MOVE 8 TO AMT-DECIMALS
END-EVALUATE
MOVE SPACES TO ERR-FIELD
EVALUATE TRUE
WHEN AMT-PRE-DECI = 10 AND AMT-DECIMALS >= 0
MOVE 'ERROR' TO ERR-FIELD
MOVE 0 TO AMT-DECIMALS
MOVE 0 TO EX-RATE-O
WHEN AMT-PRE-DECI = 9 AND AMT-DECIMALS > 0
MOVE EX-RATE-I(POINTER1:9) TO EX-RATE-O
IF EX-RATE-I(11:1) >= 5
ADD 1 TO EX-RATE-O
END-IF
MOVE 0 TO AMT-DECIMALS
WHEN AMT-PRE-DECI = 8 AND AMT-DECIMALS > 1
MOVE EX-RATE-I(POINTER1:9) TO EX-RATE-O
IF EX-RATE-I(12:1) >= 5
ADD 1 TO EX-RATE-O
END-IF
MOVE 1 TO AMT-DECIMALS
WHEN AMT-PRE-DECI = 7 AND AMT-DECIMALS > 2
MOVE EX-RATE-I(POINTER1:9) TO EX-RATE-O
IF EX-RATE-I(13:1) >= 5
ADD 1 TO EX-RATE-O
END-IF
MOVE 2 TO AMT-DECIMALS
WHEN AMT-PRE-DECI = 6 AND AMT-DECIMALS > 3
MOVE EX-RATE-I(POINTER1:9) TO EX-RATE-O
IF EX-RATE-I(14:1) >= 5
ADD 1 TO EX-RATE-O
END-IF
MOVE 3 TO AMT-DECIMALS
WHEN AMT-PRE-DECI = 5 AND AMT-DECIMALS > 4
MOVE EX-RATE-I(POINTER1:9) TO EX-RATE-O
IF EX-RATE-I(15:1) >= 5
ADD 1 TO EX-RATE-O
END-IF
MOVE 4 TO AMT-DECIMALS
WHEN AMT-PRE-DECI = 4 AND AMT-DECIMALS > 5
MOVE EX-RATE-I(POINTER1:9) TO EX-RATE-O
IF EX-RATE-I(16:1) >= 5
ADD 1 TO EX-RATE-O
END-IF
MOVE 5 TO AMT-DECIMALS
WHEN AMT-PRE-DECI = 3 AND AMT-DECIMALS > 6
MOVE EX-RATE-I(POINTER1:9) TO EX-RATE-O
IF EX-RATE-I(17:1) >= 5
ADD 1 TO EX-RATE-O
END-IF
MOVE 6 TO AMT-DECIMALS
WHEN AMT-PRE-DECI = 2 AND AMT-DECIMALS > 7
MOVE EX-RATE-I(POINTER1:9) TO EX-RATE-O
IF EX-RATE-I(18:1) >= 5
ADD 1 TO EX-RATE-O
END-IF
MOVE 7 TO AMT-DECIMALS
WHEN OTHER
COMPUTE WHOLE-NB = AMT-PRE-DECI
+ AMT-DECIMALS
END-COMPUTE
MOVE EX-RATE-I(POINTER1:WHOLE-NB)
TO EX-RATE-O
END-EVALUATE
123456*8901
* ZUT (zOS Unit Test)
* See https://github.com/neopragma/cobol-unit-test
TESTSUITE '1000000.00000001'
MOVE 1000000.00000001 TO EX-RATE-I
PERFORM R000-SQEEZE
TESTCASE 'Test - 1 - EX-RATE-O = 100000000'
EXPECT EX-RATE-O TO BE NUMERIC 100000000
TESTCASE 'Test - 2 - AMT-DECIMALS = 2'
EXPECT AMT-DECIMALS TO BE NUMERIC 2
TESTCASE 'Test - 3 - ERR-FIELD TO BE " "'
EXPECT ERR-FIELD TO BE ' '
TESTSUITE '1000000.00500001'
MOVE 1000000.00500001 TO EX-RATE-I
PERFORM R000-SQEEZE
TESTCASE 'Test - 1 - EX-RATE-O = 100000001'
EXPECT EX-RATE-O TO BE NUMERIC 100000001
TESTCASE 'Test - 2 - AMT-DECIMALS = 2'
EXPECT AMT-DECIMALS TO BE NUMERIC 2
TESTCASE 'Test - 3 - ERR-FIELD TO BE " "'
EXPECT ERR-FIELD TO BE ' '
TESTSUITE '4.03754525'
MOVE 4.03754525 TO EX-RATE-I
PERFORM R000-SQEEZE
TESTCASE 'Test - 1 - EX-RATE-O = 403754525'
EXPECT EX-RATE-O TO BE NUMERIC 403754525
TESTCASE 'Test - 2 - AMT-DECIMALS = 8'
EXPECT AMT-DECIMALS TO BE NUMERIC 8
TESTCASE 'Test - 3 - ERR-FIELD = " "'
EXPECT ERR-FIELD TO BE ' '
TESTSUITE '6232527821.41235741'
MOVE 6232527821.41235741 TO EX-RATE-I
PERFORM R000-SQEEZE
TESTCASE 'Test - 1 - EX-RATE-O = 0'
EXPECT EX-RATE-O TO BE NUMERIC 0
TESTCASE 'Test - 2 - AMT-DECIMALS = 0'
EXPECT AMT-DECIMALS TO BE NUMERIC 0
TESTCASE 'Test - 3 - ERR-FIELD = "ERROR"'
EXPECT ERR-FIELD TO BE 'ERROR'
TESTSUITE '1234567890.00000000'
MOVE 1234567890.00000000 TO EX-RATE-I
PERFORM R000-SQEEZE
TESTCASE 'Test - 1 - EX-RATE-O = 0'
EXPECT EX-RATE-O TO BE NUMERIC 0
TESTCASE 'Test - 2 - AMT-DECIMALS = 0'
EXPECT AMT-DECIMALS TO BE NUMERIC 0
TESTCASE 'Test - 3 - ERR-FIELD TO BE "ERROR"'
EXPECT ERR-FIELD TO BE 'ERROR'
TESTSUITE '5748.95651575'
MOVE 5748.95651575 TO EX-RATE-I
PERFORM R000-SQEEZE
TESTCASE 'Test - 1 - EX-RATE-O = 574895652'
EXPECT EX-RATE-O TO BE NUMERIC 574895652
TESTCASE 'Test - 2 - AMT-DECIMALS = 5'
EXPECT AMT-DECIMALS TO BE NUMERIC 5
TESTCASE 'Test - 3 - ERR-FIELD TO BE " "'
EXPECT ERR-FIELD TO BE ' '
TESTSUITE '0000000000.00000001'
MOVE 0.00000001 TO EX-RATE-I
PERFORM R000-SQEEZE
TESTCASE 'Test - 1 - EX-RATE-O = 000000001'
EXPECT EX-RATE-O TO BE NUMERIC 000000001
TESTCASE 'Test - 2 - AMT-DECIMALS = 8'
EXPECT AMT-DECIMALS TO BE NUMERIC 8
TESTCASE 'Test - 3 - ERR-FIELD TO BE " "'
EXPECT ERR-FIELD TO BE ' '