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

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

For eg,

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

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


person Srinivasan    schedule 11.05.2011    source источник


Ответы (4)


Для решения 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<    
person NealB    schedule 12.05.2011

Это тоже работает...

  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                                     
      .  
person Raja Reddy    schedule 26.05.2011
comment
Это не работает. Во-первых, с Enterprise Cobol целью UNSTRING не может быть редактируемое поле, поэтому вы получаете серьезную ошибку компиляции IGYPA3107-S UNSTRING INTO идентификатор DEST-DATA (NUMERIC-EDITED) недействителен, поскольку он является одним из следующих: редактируемый элемент, внешний элемент с плавающей запятой, буквенный элемент с B в его PICTURE или числовой элемент с P в его PICTURE. Оператор был отброшен. Во-вторых, если бы он действительно работал, BBB на ИЗОБРАЖЕНИИ для трех фактических пробелов, поэтому данные были бы усечены до одной цифры/символа. - person Bill Woodger; 27.01.2013

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

  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 содержит истинную числовую версию исходных данных.

person brianc    schedule 25.10.2012
comment
Поскольку вы не беспокоитесь о том, что ваше истинное числовое значение является числовым, вы можете УДАЛИТЬ СТРОКУ в DEST-DATA-N, которая выровнена по правому краю и заполнена начальным нулем. Сохраняет INSPECT и MOVE, и вам не нужно ПЕРЕМЕЩАТЬ буквенно-цифровое значение в числовое. - person Bill Woodger; 28.01.2013

Более «подробный» ответ, чем у NealB, меньше нагрузки на ЦП.

   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<
person Bill Woodger    schedule 28.01.2013