解码二进制编码的十进制



我有一个字段pic X(03),其中的日期为X'160101'格式yymmdd。

我想知道如何将其转换为图片x(06)。

到目前为止,我试图将其移回9(03)comp,并将9(03)比9(06),但没用。

我该怎么做?

您所拥有的是二进制编码十进制(BCD)。也就是说,数据保存在二进制字段中,但对值很重要的是十进制表示,而不是二进制。X’160101’的值为1442049。X’160201’为1442305。因此,如果你能把它当作一个二进制字段(你必须预先准备一个二进制零,使其成为二进制字段的正确长度),你就必须做一些愚蠢的计算。

所以你可以做一些不同的、更容易的事情。BCD不是本机COBOL数据类型。PACKED-DECIMAL(通常与COMP-3COMPUTATIONAL-3相同)是一种BCD类型,它包括低位(最右边)半字节中的符号值。所以不是一个BCD,但你可以像这样把你的BCD当作包装的十进制:

01  BCD-TO-PACKED.
    05  BTP-SOURCE-BCD                  PIC XXX.
    05  BTP-PACKED-ZERO  PACKED-DECIMAL PIC 9 VALUE ZERO.
01  FILLER 
    REDEFINES BCD-TO-PACKED.
    05  BTP-PACKED-TO-MOVE
                         PAKCED-DECIMAL PIC 9(6)V9.
01  DATE-AS-PIC-X                       PIC X(6).
01  DATA-AS-CHARACTER-NUMERIC
    REDEFINES DATE-AS-PIC-X             PIC 9(6).

    MOVE your-source-value       TO BTP-SOURCE-BCD
    MOVE BTP-PACKED-TO-MOVE      TO DATA-AS-CHARACTER-NUMERIC

之后,你可以很高兴地引用DATE-AS-PIC-X,用它做任何你想做的事情。

BCD-TO-PACKED是一个四字节的组字段,通过VALUE子句并且不做任何更改,它在最后一个字段中具有X"F"。这是一个无符号压缩十进制字段,有一个数字,值为零。

然后对BTP-SOURCE-BCD进行X到X移动。BCD-TO-PACKED现在看起来是这样的:X'1601010F'。这对于压缩的十进制字段是完全有效的。你可以把它除以10来得到你的日期(将其重新定义为PACKED-DECIMAL PIC 9(7)),但为什么要浪费CPU?

相反,在REDEFINES中,您可以定义一个小数点(V9)。当编译器生成代码将其移动到另一个没有小数位数的数字字段时,源小数位数就会被删除。Presto!除以10而不除数。

注:选择的数据名称有助于解释。你应该让你的名字对数据有意义,而不仅仅是使用"陈腐"的名字。"字符数字"在COBOL中称为USAGE DISPLAY,如果未提供USAGE,则为默认值。USAGE这个词本身很少使用。因此,当PIC X或PIC 9字段没有其他用途时,使用显示就是您所拥有的。

注意:您可能不应该使用两位数的年份。您将无法处理早于2000年或晚于2199年的日期。历史上两位数年份的使用是由于昂贵的磁盘存储和"数据冗余"(所有世纪的值都是19,那么为什么同一账户的值在不同的时间保持19 80)。如果使用两位数的年份,请确保某个地方与本世纪相关。

注意:如果您试图将PIC X字段移动到数字字段,编译器将假定您在字段中有有效的字符号,这也是您最初尝试失败的原因之一。

如果您搜索stackoverflow,您应该会找到答案(这已经得到了答案)。

但是创建一个类似(my-date-x保存日期)的字段:

   03  my-date-x            pic x(3).
   03  my-date-9            pic 9(6).
   03  date-ymdv0           pic 9(6)v9 comp-3.
   03  date-x               pic x(3) redefines date-ymdv0.

代码是

   Move 0                   to date-ymdv0 
   Move my-date-x           to date-x
   Move date-ymdv0          to my-date-9

它工作的原因是9(6)v9 comp3160101存储为x'1601010c'这就是你所拥有的(最后加一个0c)。

最新更新