【问题标题】:how to format a number to S9(5)V99 ascii in .net如何在.net中将数字格式化为S9(5)V99 ascii
【发布时间】:2011-03-16 12:37:20
【问题描述】:

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

【问题讨论】:

    标签: .net cobol number-formatting


    【解决方案1】:

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

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


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

    【讨论】:

    • 我想将文件上传到网络服务。根据他们的规范,金额字段的格式为 S9(5)V99
    • 我想将文件上传到网络服务。根据他们的规范,金额字段的格式为 S9(5)V99。我们sql数据库中的amount字段是十进制字段
    • @user:他们应该学习 COBOL 以外的语言。 S9(5)V99 对于 COBOL 程序员以外的任何人都毫无意义。
    【解决方案2】:

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

    COBOL 数据声明有点奇怪,需要一些时间来适应。这是一个介绍性的链接 COBOL data declarations 上的教程。 这应该可以帮助您入门。

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

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

    基本上,您是在告诉 COBOL 编译器定义一个能够保存的数值变量 值 -99999.99 到 +99999.99。编译器将如何实现这一点 请求取决于特定的USAGE 子句。但是,对于包含 固定小数位,“正常”使用是 PACKED-DECIMALCOMP-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

    【讨论】:

    • @user392973 @John Saunders。根据您对 John Saunders 的评论,您的客户正在寻找的 USAGE 类型可能不是 PACKED-DECIMAL 而是 DISPLAY(最好与您的客户澄清这一点)。如果 USAGE 是 DISPLAY,那么只需分配一个 8 字节字符串并按照 John 给您的答案格式化数字。如果目标环境是 IBM 大型机,接下来要注意的是 EBCDIC/ASCII 字符集之间的代码页问题。
    • 如果这些人想要 Web 服务向他们发送 PACKED-DECIMAL 或 EBCDIC,那么他们需要醒来并闻一闻十年的味道。
    • @约翰桑德斯。同意!仍然有一些人发现运行 COBOL 的 IBM 大型机在他们的世界中心。重要的是要了解您在使用它们时可能遇到的各种问题。任何基于 COBOL 图片子句指定数据交换格式的人不仅落后于时代几十年——他们显然已经失传了。
    【解决方案3】:

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

    【讨论】:

    • 为什么觉得S999是“二进制”?不必如此。 S 是“暗示的”,而不是“假定的”。 USAGE DISPLAY 字段被“打孔”,packed-decimal/comp-3 或 binary/comp/comp-4/comp-5 不是,因为它们一开始就不会被“打孔”。 “50C”是正值 503,“50}”是 -500。如果它是一个被过度打孔的“+”,那么它将是一个正数。
    【解决方案4】:

    公共函数 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
    

    结束函数

    【讨论】:

    • 请附上你的答案的解释,而不仅仅是代码。
    猜你喜欢
    • 1970-01-01
    • 2023-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多