Quelqu'un sait-il comment convertir un type de données VB Double en Cobol S9 (15) V99 Comp-3?Comment convertir VB's Double en COBOL's COMP-3?
Répondre
Si cela ne doit pas être fait dans le même programme, il me semble qu'il serait plus facile de trouver un format commun que VB et COBOL peuvent comprendre.
Ce serait du texte. En d'autres termes, la solution la plus simple peut être d'écrire le numéro dans un fichier en tant que texte "3.14159" et que le code COBOL le lise dans ce format et MOVE
dans le champ COMP-3
?
Si ce n'est pas possible, le COMP-3
est un type BCD assez simple. Je convertirais le nombre en une chaîne de toute façon, puis prendre deux caractères à la fois dans un tableau d'octets.
Le S9 (15) V99 nécessite 18 quartets (un demi-octet étant de 4 bits, ou une demi-octet) pour stocker:
- le bit de nombre entier (quinze quartets).
- le bit fractionnaire (deux bits).
- le signe (un nybble).
Aucun espace n'est requis pour la virgule décimale car V
est une décimale implicite, et non réelle.
Ainsi, le nombre 3.14
serait représenté par les octets:
00 00 00 00 00 00 00 31 4C
Le seul peu délicat est que nybble signe final (pour C
positif et négatif pour D
).
Voici un peu de code que j'ai fouetté dans Excel VBA (je n'ai malheureusement pas installé VB sur cette machine) qui vous montre comment faire. La fonction makeComp3() devrait être facilement transférée dans un vrai programme VB.
Le programme de test fournit en sortie les valeurs de macro 0
, 49
et 76
qui sont HEX 00
, 31
et 4C
respectivement (00314C
est +3.14
).
La première étape (après toutes les déclarations) est de faire la double une décimale implicite en le multipliant par la puissance pertinente de dix transformer ensuite en un entier:
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)
Ensuite, nous en faisons une chaîne de la bonne taille, pour faciliter le traitement:
' 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
Ensuite, nous traitons cette chaîne à deux chiffres à la fois et chaque paire est combiné dans une nybble de sortie. La dernière étape consiste à traiter le dernier chiffre avec le signe:
' 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
Et ceci est juste le faisceau de test, mais il pourrait probablement faire avec un peu plus des cas de test :-)
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
Salut, Je voulais que la conversion soit faite en VB mais je ne sais pas comment. Anywayz merci pour la réponse. Eh bien, y at-il de toute façon coder la conversion en VB? Ce que fait le programme, c'est qu'il lit une entrée de chaîne, puis convertit les chiffres numériques en COMP-3 dans cobol et les stocke dans un fichier texte. – Grekoz
Voir la mise à jour. – paxdiablo
- 1. Comment convertir un double en hexadécimal?
- 2. Comment convertir un double en chaîne en C++?
- 3. Convertir une chaîne en double - Java
- 4. Convertir la chaîne en double - VB
- 5. Comment convertir un double en valeur entière la plus proche?
- 6. Comment convertir un double en long sans coulée?
- 7. Comment convertir un double * en un tableau <double> (6)
- 8. Durée Fonction vbscript (vbs)
- 9. Convertir le double en chaîne avec une largeur fixe
- 10. chaîne VBS wizzardry
- 11. VBS Computer Info Script
- 12. Système d'exploitation Script VBS
- 13. Comment convertir une chaîne en TimeSeriesDataItem
- 14. Comment convertir en datetime
- 15. Comment convertir la fonction SERIESSUM en VB6?
- 16. Envoi double en C#?
- 17. Java: conversion d'un double en chaîne
- 18. fonction efficace pour convertir float/double pour chaîne
- 19. Comment convertir les photos Decimal en T?
- 20. Comment convertir une chaîne en RegularTimePeriod en java?
- 21. Résultat en double
- 22. WebClient.UploadValues Clé en double
- 23. double $ déclaration en php
- 24. Convertir un double à une chaîne en Java et vice-versa sans perdre la précision
- 25. Comment convertir implicitement Tuples en vectoriel dans Scala
- 26. Comment convertir NSDecimalNumber en NSInteger?
- 27. Comment convertir int [] en byte []
- 28. Comment convertir cstring en NSString?
- 29. Comment convertir Scope_Identity() en int?
- 30. Comment convertir NSString en char?
Voir réponse mise à jour. – paxdiablo