6

我一直在寻找 s9(5)v99 但得到了不同的信息并且不是很清楚。有人可以展示如何转换或转换公式。谢谢

4

4 回答 4

20

您在这里向我们展示PICTURE的是 COBOL 数据声明的子句部分。

COBOL 数据声明有点奇怪,需要一些时间来适应。这是一个关于COBOL 数据声明的介绍性教程的链接。这应该让你开始。

您在问题中给出的 PICture 子句定义了一个具有以下特征的数字项:

  • S- 领先的标志
  • 9(5)- 5 位小数
  • V- 隐含小数点
  • 99- 隐含小数点后 2 位

基本上,您是在告诉 COBOL 编译器定义一个能够保存值 -99999.99 到 +99999.99 的数值变量。编译器将如何满足这个要求取决于具体的USAGE条款。但是,对于包含固定小数位的数字项目,“正常”用法是PACKED-DECIMALor COMP-3(这些只是不同的名称,意思相同)。此链接 提供了一些有关压缩十进制数据的存储表示的介绍性信息。

压缩十进制数据对于进行小数点数必须保持固定的数值计算很有用。

将打包的十进制数据写入报表或终端并不是特别好。您必须首先将其转换为可用的DISPLAY格式。这涉及MOVE将压缩十进制值添加到另一个具有USAGE DISPLAY属性的变量中。假设您的压缩十进制变量被调用 PACKED-DECIMAL-NBR并且保持值 -2345.01。您可以定义一个显示变量以将其保存为:

01    DISPLAY-NBR     PIC +++,++9.99.

那么当需要写入/显示包含在其中的值时,PACKED-DECIMAL-NBR您会执行以下操作:

MOVE PACKED-DECIMAL-NBR TO DISPLAY-NBR
DISPLAY DISPLAY-NBR

MOVE压缩十进制数转换为可以在报告或终端上显示的字符表示。显示值-2,345.01

于 2010-07-15T20:36:33.567 回答
2

cobol 中的 S 是有符号数字字段的定义(即可以是正数或负数)。因此,例如 S999 是有符号的 3 位数字(二进制​​)。问题是假设为 S ,并且在大多数 cobol 编译器中,标记符号的方式是通过用另一个字符“过度打孔”最后一个字符来表示加号或减号。这导致,如果您在 ascii 浏览器中查看该字段,您将有一个奇怪的字符。IE。MINUS 500 看起来像这样 50C 或 50} 取决于基础字符以及它是否是一个过分的 + 或 -。

于 2013-01-28T22:54:50.453 回答
0

PIC S9(5)v99不是数字格式。它描述了数据的存储方式及其含义。例如,存储为“-0010000”的数字表示-100.00。

你到底想完成什么?您是否尝试将decimal-100.00 发送到 COBOL 程序?


PIC -99,999.00 一种数字格式。它指定在数字为负数时使用前导减号,在小数点前使用五位数字,在千位之间使用逗号,小数点,然后正好是两位数。存储在PIC S9(5)V99字段中的数字可能会合理地移动到PIC -99,999.00字段中。

于 2010-07-15T16:40:41.083 回答
0

公共函数 CobolToDec(ByVal str As String) As Double

' **********************************************************************
' * Purpose:    Converts Cobol numbers into dubble-values in MS format.
' * Author:     Mikael Bergstrom
' * Date:       2017-11-06
' * Input:      str = Cobolcoded value for amount S9(13)V99(Cobol)
' *             Signs are in last byte
' **********************************************************************

Dim strNeg As String
strNeg = "pqrstuvwxy"


' If letter in strNeg then convert to number and negative sign
' p = 0, q = 1, r = 2 osv...

' Two last digits are decimals.
' Ex 00000000001200y = -120,09
' Ex 000000000015000 = 150,00

' Contains negative sign?
If InStr(1, str, "-", vbTextCompare) Then
    dectal = CDbl(Trim(str))
    CobolToDec = dectal
Else
' ...if not sign -> convert last digit to represetative digit and make hole number negative.
    lastbyte = LCase(Right(str, 1))
    If Not IsNumeric(lastbyte) Then
        If InStr(1, strNeg, lastbyte, vbTextCompare) > 0 Then
            dectal = "-" & Left(str, 13) & "," & Mid(str, 14, 1) & CStr(InStr(strNeg, lastbyte) - 1)
        Else
            ' not valid negative sign in strNeg (pqrstuvwxy)
            ' Set 0 ast last sign as we don?t know and make negative number
            dectal = "-" & Left(str, 13) & "," & Mid(str, 14, 1) & "0"
        End If
    Else
        ' positive number, just separate the two decimals
        dectal = Left(str, 13) & "," & Right(str, 2)
    End If

    ' Convert into double datatype and return result
    CobolToDec = CDbl(FormatNumber(dectal, 2, , , vbFalse))
End If

结束功能

于 2019-11-15T09:00:51.940 回答