Как преобразовать текст в числовой формат в мэйнфрейме

#mainframe

#мэйнфрейм

Вопрос:

Мне нужно преобразовать числа, хранящиеся в виде текстовых данных (выровненных по левому краю) в диапазоне от 2 до 4 цифр, в числовой формат (выровненный по правому краю) в мэйнфреймах.

 For eg,

Field1(Text left aligned)         Field2(Numeric Right aligned)
---------------------------------------------------------------
1000                                       1000           
11                                           11     
200                                         200 
  

Можно использовать SORT EZTRIEVE COBOL.

Ответ №1:

Для решения на COBOL попробуйте использовать UNSTRING и JUSTIFIED RIGHT принимающее поле. Вот пример программы (IBM Enterprise COBOL) для иллюстрации.

   IDENTIFICATION DIVISION.                       
    PROGRAM-ID. EXAMPLE1.                        
  DATA DIVISION.                                 
  WORKING-STORAGE SECTION.                       
  01  SOURCE-DATA       PIC X(4).                
  01  DEST-DATA         PIC X(4) JUSTIFIED RIGHT. 
  PROCEDURE DIVISION.                            
      MOVE '123' TO SOURCE-DATA                  
      UNSTRING SOURCE-DATA DELIMITED BY SPACE    
          INTO DEST-DATA                         
      DISPLAY 'SOURCE >' SOURCE-DATA '<'         
      DISPLAY 'DEST   >' DEST-DATA '<'           

      MOVE '1' TO SOURCE-DATA                    
      UNSTRING SOURCE-DATA DELIMITED BY SPACE 
          INTO DEST-DATA                         
      DISPLAY 'SOURCE >' SOURCE-DATA '<'         
      DISPLAY 'DEST   >' DEST-DATA '<'           
      GOBACK                                     
      .  
  

Вывод этой программы:

 SOURCE >123 <    
DEST   > 123<    
SOURCE >1   <    
DEST   >   1<    
  

Ответ №2:

Это также работает…

   IDENTIFICATION DIVISION.                       
    PROGRAM-ID. STR2NUM.                        
  DATA DIVISION.                                 
  WORKING-STORAGE SECTION.                       
  01  SOURCE-DATA       PIC X(4).                
  01  DEST-DATA         PIC BBB9. 
  PROCEDURE DIVISION.                            
      MOVE '123' TO SOURCE-DATA                  
      UNSTRING SOURCE-DATA DELIMITED BY SPACE    
          INTO DEST-DATA                         
      DISPLAY 'SOURCE >' SOURCE-DATA '<'         
      DISPLAY 'DEST   >' DEST-DATA '<'           

      MOVE '1' TO SOURCE-DATA                    
      UNSTRING SOURCE-DATA DELIMITED BY SPACE 
          INTO DEST-DATA                         
      DISPLAY 'SOURCE >' SOURCE-DATA '<'         
      DISPLAY 'DEST   >' DEST-DATA '<'           
      GOBACK                                     
      .  
  

Комментарии:

1. Это не работает. Во-первых, с Enterprise Cobol целью UNSTRING не может быть отредактированное поле, поэтому вы получаете серьезную ошибку компиляции «IGYPA3107-S «UNSTRING В «идентификатор» «DEST-DATA (NUMERIC-EDITED)» был недопустимым, поскольку это один из следующих: отредактированный элемент , внешний элемент с плавающей запятой, алфавитный элемент с «B» в его «КАРТИНКЕ» или числовой элемент с «P» в его «КАРТИНКЕ». Инструкция была отброшена.». Во-вторых, если бы это сработало, BBB на картинке были для трех фактических пробелов, поэтому данные были бы усечены до одной цифры / символа.

Ответ №3:

Я позволю себе не согласиться с двумя другими ответами, поскольку они, IMO, просто повторно представляют исходный текст в виде отредактированного буквенно-цифрового вывода. Вот мой пример:

   IDENTIFICATION DIVISION.                       
  PROGRAM-ID. STR2NUM.                        
  DATA DIVISION.                                 
  WORKING-STORAGE SECTION.            
  01  WS-VARIABLES.           
    05  SRCE-DATA         PIC  X(4). 
    05  SRCE-DATA-R       PIC  X(4) JUST RIGHT.      
    05  DEST-DATA-N       PIC  9(4).         
    05  DEST-DATA         PIC  ZZZ9. 
  PROCEDURE DIVISION. 
      INITIALIZE WS-VARIABLES                           
      MOVE '11' TO SRCE-DATA                  
      UNSTRING SRCE-DATA DELIMITED BY SPACE    
          INTO SRCE-DATA-R
      INSPECT SRCE-DATA-R
          REPLACING ALL SPACES BY ZEROES
      MOVE SRCE-DATA-R TO DEST-DATA-N, DEST-DATA                         
      DISPLAY 'SOURCE >' SRCE-DATA '<'         
      DISPLAY 'DEST   >' DEST-DATA '<'           
      GOBACK                                     
      .  
  

Поле DEST-DATA-N содержит истинную числовую версию исходных данных.

Комментарии:

1. Поскольку вы не беспокоитесь о том, что ваше «истинное число» является числовым, вы можете разархивировать в DEST-DATA-N, который выравнивается по правому краю и заполняется начальным нулем. Сохраняет ПРОВЕРКУ и ПЕРЕМЕЩЕНИЕ, и вам не нужно будет ПЕРЕМЕЩАТЬ буквенно-цифровой формат в числовой.

Ответ №4:

Более «подробный» ответ, чем у Нилба, меньшая нагрузка на процессор.

    IDENTIFICATION DIVISION. 
   PROGRAM-ID. STR2NUM. 
   DATA DIVISION. 
   WORKING-STORAGE SECTION. 
   01  SOURCE-DATA                         PIC X(4). 
       88  SD-NO-DATA                      VALUE SPACE.
   01  FILLER REDEFINES SOURCE-DATA. 
       05  SOURCE-DATA-ALL                 PIC 9(4). 
   01  FILLER REDEFINES SOURCE-DATA. 
       05  SD-LEADING-1                    PIC 9. 
       05  SD-TRAILING-3                   PIC X(3). 
           88  SD-DATA-1-LEADING           VALUE SPACE.
   01  FILLER REDEFINES SOURCE-DATA. 
       05  SD-LEADING-2                    PIC 99. 
       05  SD-TRAILING-2                   PIC XX. 
           88  SD-DATA-2-LEADING           VALUE SPACE.
   01  FILLER REDEFINES SOURCE-DATA. 
       05  SD-LEADING-3                    PIC 9(3). 
       05  SD-TRAILING-1                   PIC X. 
           88  SD-DATA-3-LEADING           VALUE SPACE.
   01  DEST-DATA                           PIC 9(4). 
   PROCEDURE DIVISION. 
       MOVE '1234'                  TO SOURCE-DATA 
       PERFORM                      PROCESS-THE-DATA 
       MOVE '123'                   TO SOURCE-DATA 
       PERFORM                      PROCESS-THE-DATA 
       MOVE '12'                    TO SOURCE-DATA 
       PERFORM                      PROCESS-THE-DATA 
       MOVE '1'                     TO SOURCE-DATA 
       PERFORM                      PROCESS-THE-DATA 
       MOVE SPACE                   TO SOURCE-DATA 
       PERFORM                      PROCESS-THE-DATA 
       GOBACK 
       . 
   PROCESS-THE-DATA. 
       EVALUATE TRUE 
           WHEN SD-NO-DATA 
             MOVE ZERO              TO DEST-DATA
           WHEN SD-DATA-1-LEADING 
             MOVE SD-LEADING-1      TO DEST-DATA
           WHEN SD-DATA-2-LEADING 
             MOVE SD-LEADING-2      TO DEST-DATA
           WHEN SD-DATA-3-LEADING 
             MOVE SD-LEADING-3      TO DEST-DATA
           WHEN OTHER 
             MOVE SOURCE-DATA-ALL   TO DEST-DATA
       END-EVALUATE 

       DISPLAY 'SOURCE >' SOURCE-DATA '<' 
               'DEST   >' DEST-DATA '<' 
       . 
  

Что дает:

 SOURCE >1234<DEST   >1234<
SOURCE >123 <DEST   >0123<
SOURCE >12  <DEST   >0012<
SOURCE >1   <DEST   >0001<
SOURCE >    <DEST   >0000<