有沒有人知道如何將VB雙轉換爲Cobol S9(15)V99 Comp-3數據類型?如何將VB的Double轉換爲COBOL的COMP-3?
回答
如果不需要在同一個程序中完成,在我看來,找到COBOL可以理解的VB 和的通用格式會更容易。
這將是文字。換句話說,最簡單的解決方案可能是將文件的編號寫爲文本「3.14159」,並讓COBOL代碼以該格式讀取它,然後MOVE
將其輸入到COMP-3
字段中?
如果這是不可能的,COMP-3
是一個相當簡單的BCD類型。無論如何,我會將該數字轉換爲字符串,然後每次將兩個字符轉換爲字節數組。
的S9(15)V99要求18半字節(一個半字節是4位,或半八位字節),用於存儲:
- 整數位(15半字節)。
- 小數位(兩個nybbles)。
- 符號(一個nybble)。
小數點不需要空格,因爲V
是隱含的小數,而不是真實的小數。
所以數量3.14
將被表示爲字節:
00 00 00 00 00 00 00 31 4C
唯一棘手的一點是,最終符號半字節(C
用於正和D
爲負)。
這是我在Excel VBA中掀起的一小段代碼(我沒有在這臺機器上安裝VB),它告訴你如何去做。 makeComp3()函數應該很容易轉換成真正的VB程序。
宏測試程序輸出它們分別十六進制00
,31
和4C
值0
,49
76
和(00314C
是+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
然後,我們處理該串在一個時間兩位數字,每對被組合成一個輸出半字節。最後一步是用符號一起處理最後一個數字:
' 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中完成,但不知道如何。 Anywayz感謝您的答覆。那麼無論如何編碼在VB中的轉換?該程序的功能是讀取一個字符串輸入,然後將數字轉換爲cobol中的COMP-3並將其存儲到文本文件中。 – Grekoz 2009-02-11 03:38:36
- 1. 如何將Double []轉換爲double []?
- 2. 將Cobol copybook轉換爲XSD
- 3. 將double轉換爲long double的算法
- 4. 任何方式將從Double轉換爲Hex在vb中?
- 5. 如何在Scala中將Array [(Double,Double)]轉換爲Array [Double]?
- 6. 如何將「格式化的double(String)」轉換爲double?
- 7. 如何將double轉換爲String?
- 8. 如何將ILArray轉換爲double [,]數組?
- 9. 如何將double轉換爲hex?
- 10. 如何將double值轉換爲hh:mm?
- 11. 如何將short []轉換爲double []?
- 12. 如何將%02d:%02d:%02d轉換爲double?
- 13. 如何將一個double轉換爲NSInteger?
- 14. 如何將double類型轉換爲CGAffineTransform?
- 15. 如何將char *轉換爲double *?
- 16. 如何將``char *``轉換爲``double *``
- 17. Java中如何將double轉換爲int?
- 18. 如何將"轉換爲double qoutes
- 19. 如何將InputStream.read()轉換爲double?
- 20. 如何將列表[Double]轉換爲列?
- 21. 如何將SQL_NUMERIC_STRUCT轉換爲double和string?
- 22. 如何將int轉換爲double?
- 23. 如何將double轉換爲HH:MM:SS ObjectiveC
- 24. 如何將`SInt16'轉換爲'double'?
- 25. 如何將double轉換爲字符串?
- 26. C#:如何將TimeSpan值轉換爲double?
- 27. 如何不將double轉換爲int C#?
- 28. 如何轉換爲Double
- 29. 無法將'double(_cdecl *)()'轉換爲'double'
- 30. 將C++ double轉換爲DEC double
見更新的答案。 – paxdiablo 2009-02-11 04:29:28