我一直在寻找 s9(5)v99 但得到了不同的信息并且不是很清楚。有人可以展示如何转换或转换公式。谢谢
4 回答
您在这里向我们展示PICTURE
的是 COBOL 数据声明的子句部分。
COBOL 数据声明有点奇怪,需要一些时间来适应。这是一个关于COBOL 数据声明的介绍性教程的链接。这应该让你开始。
您在问题中给出的 PICture 子句定义了一个具有以下特征的数字项:
S
- 领先的标志9(5)
- 5 位小数V
- 隐含小数点99
- 隐含小数点后 2 位
基本上,您是在告诉 COBOL 编译器定义一个能够保存值 -99999.99 到 +99999.99 的数值变量。编译器将如何满足这个要求取决于具体的USAGE
条款。但是,对于包含固定小数位的数字项目,“正常”用法是PACKED-DECIMAL
or 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
。
cobol 中的 S 是有符号数字字段的定义(即可以是正数或负数)。因此,例如 S999 是有符号的 3 位数字(二进制)。问题是假设为 S ,并且在大多数 cobol 编译器中,标记符号的方式是通过用另一个字符“过度打孔”最后一个字符来表示加号或减号。这导致,如果您在 ascii 浏览器中查看该字段,您将有一个奇怪的字符。IE。MINUS 500 看起来像这样 50C 或 50} 取决于基础字符以及它是否是一个过分的 + 或 -。
PIC S9(5)v99
不是数字格式。它描述了数据的存储方式及其含义。例如,存储为“-0010000”的数字表示-100.00。
你到底想完成什么?您是否尝试将decimal
-100.00 发送到 COBOL 程序?
PIC -99,999.00
是一种数字格式。它指定在数字为负数时使用前导减号,在小数点前使用五位数字,在千位之间使用逗号,小数点,然后正好是两位数。存储在PIC S9(5)V99
字段中的数字可能会合理地移动到PIC -99,999.00
字段中。
公共函数 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
结束功能