Ad

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