【发布时间】:2011-03-16 12:37:20
【问题描述】:
我一直在搜索 s9(5)v99,但得到了不同的信息并且不是很清楚。有人可以展示如何转换或转换公式。谢谢
【问题讨论】:
标签: .net cobol number-formatting
我一直在搜索 s9(5)v99,但得到了不同的信息并且不是很清楚。有人可以展示如何转换或转换公式。谢谢
【问题讨论】:
标签: .net cobol number-formatting
PIC S9(5)v99 不是数字格式。它描述了数据的存储方式及其含义。例如,存储为“-0010000”的数字表示-100.00。
您到底想完成什么?您是否尝试将 decimal -100.00 发送到 COBOL 程序?
PIC -99,999.00是一种数字格式。它指定在数字为负数时使用前导减号,在小数点前使用五位数字,在千位之间使用逗号,小数点,然后正好是两位数。存储在 PIC S9(5)V99 字段中的数字可能会合理地移动到 PIC -99,999.00 字段中。
【讨论】:
您在这里向我们展示的是
COBOL 数据声明的PICTURE 子句部分。
COBOL 数据声明有点奇怪,需要一些时间来适应。这是一个介绍性的链接 COBOL data declarations 上的教程。 这应该可以帮助您入门。
您在问题中给出的 PICture 子句定义了一个具有以下内容的数字项 特点:
S - 领先标志9(5) - 5 位小数V - 隐含小数点99 - 隐含小数点后 2 位数字基本上,您是在告诉 COBOL 编译器定义一个能够保存的数值变量
值 -99999.99 到 +99999.99。编译器将如何实现这一点
请求取决于特定的USAGE 子句。但是,对于包含
固定小数位,“正常”使用是 PACKED-DECIMAL 或 COMP-3(这些只是
不同的名字意思相同)。这个link
提供一些关于压缩十进制数据的存储表示的介绍性信息。
压缩十进制数据对于进行小数点数必须的数值计算很有用 保持不变。
将压缩十进制数据写入报表或终端的效果不是特别好。你必须
首先将其转换为DISPLAYable 格式。这涉及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},具体取决于底层字符以及它是否是一个过分的 + 或 -。
【讨论】:
公共函数 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
结束函数
【讨论】: