【问题标题】:How do I convert VB's Double to COBOL's COMP-3?如何将 VB 的 Double 转换为 COBOL 的 COMP-3?
【发布时间】:2009-02-11 03:21:19
【问题描述】:

这里有人知道如何将 VB Double 转换为 Cobol S9(15)V99 Comp-3 数据类型吗?

【问题讨论】:

    标签: vb.net cobol


    【解决方案1】:

    如果不需要在同一个程序中完成,在我看来,找到一个VB COBOL都能理解的通用格式会更容易。

    那将是文本。换句话说,最简单的解决方案可能是将数字作为文本“3.14159”写到文件中,并让 COBOL 代码以该格式读取它,并将MOVE 写入COMP-3 字段?

    如果这不可能,COMP-3 是一个相当简单的 BCD 类型。无论如何,我都会将数字转换为字符串,然后一次将两个字符转换为字节数组。

    S9(15)V99 需要 18 个 nybbles(一个 nybble 是 4 位,或半个八位字节)来存储:

    • 整数位(15 个 nybbles)。
    • 小数位(两个 nybbles)。
    • 标志(一个 nybble)。

    小数点不需要空格,因为 V 是隐含的小数,而不是真实的小数。

    所以数字3.14 将表示为字节:

    00 00 00 00 00 00 00 31 4C
    

    唯一棘手的一点是最终符号 nybble(C 表示正数,D 表示负数)。

    这是我在 Excel VBA 中编写的一些代码(很遗憾,我没有在这台机器上安装 VB),它向您展示了如何做到这一点。 makeComp3() 函数应该可以很容易地转移到一个真正的 VB 程序中。

    宏测试程序输出值04976,分别是十六进制00314C00314C+3.14)。

    第一步(在所有声明之后)是将双精度数乘以十的相关幂,然后将其转换为整数,从而使双精度数成为隐含的​​小数:

    Option Explicit
    
    ' makeComp3. '
    '   inp is the double to convert. '
    '   sz is the minimum final size (with sign). '
    '   frac is the number of fractional places. '
    
    Function makeComp3(inp As Double, sz As Integer, frac As Integer) As String
        Dim inpshifted As Double
        Dim outstr As String
        Dim outbcd As String
        Dim i As Integer
        Dim outval As Integer
        Dim zero As Integer
        zero = Asc("0")
    
        ' Make implied decimal. '
        inpshifted = Abs(inp)
        While frac > 0
            inpshifted = inpshifted * 10
            frac = frac - 1
        Wend
        inpshifted = Int(inpshifted)
    

    接下来,我们把它做成一个正确大小的字符串,方便处理:

        ' Get as string and expand to correct size. '
        outstr = CStr(inpshifted)
        While Len(outstr) < sz - 1
            outstr = "0" & outstr
        Wend
        If Len(outstr) Mod 2 = 0 Then
            outstr = "0" & outstr
        End If
    

    然后我们一次处理该字符串两个数字,并将每一对组合成一个输出 nybble。最后一步是处理最后一个数字和符号:

        ' Process each nybble pair bar the last. '
        outbcd = ""
        For i = 1 To Len(outstr) - 2 Step 2
            outval = (Asc(Mid(outstr, i)) - zero) * 16
            outval = outval + Asc(Mid(outstr, i + 1)) - zero
            outbcd = outbcd & Chr(outval)
        Next i
    
        ' Process final nybble including the sign. '    
        outval = (Asc(Right(outstr, 1)) - zero) * 16 + 12
        If inp < 0 Then
            outval = outval + 1
        End If
    
        makeComp3 = outbcd & Chr(outval)
    End Function
    

    这只是测试工具,尽管它可能与更多的测试用例一起使用 :-)

    Sub Macro1()
        Dim i As Integer
        Dim cobol As String
    
        cobol = makeComp3(3.14159, 6, 2)
        For i = 1 To Len(cobol)
            MsgBox CStr(Asc(Mid(cobol, i)))
        Next i
    End Sub
    

    【讨论】:

    • 您好,我希望在 VB 中进行转换,但不知道如何操作。无论如何感谢您的回复。那么无论如何在VB中编码转换?该程序所做的是读取字符串输入,然后将数字转换为 cobol 中的 COMP-3 并将其存储到文本文件中。
    猜你喜欢
    • 1970-01-01
    • 2016-09-04
    • 2019-04-21
    • 2020-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多