Bonjour à tous,
Je reçoit un fichier créé en cobol avec du numérique étendu S9(16)V9(02).
le fichier est en txt.
Y a-t-il une méthode java pour traduire cette zone numérique signée en Double ou Float ?
Merci d'avance.
JMM
Bonjour à tous,
Je reçoit un fichier créé en cobol avec du numérique étendu S9(16)V9(02).
le fichier est en txt.
Y a-t-il une méthode java pour traduire cette zone numérique signée en Double ou Float ?
Merci d'avance.
JMM
Si je ne me trompe pas...
S9(16) = 17 caractères
V9(02) = 2 caractères
Je ne connais pas vraiment de méthode, mais vous devriez pouvoir parser votre fichier...
Je me doute que vous devriez y avoir penser avant, mais si d'autres se posent la question de ce que je sous-entendais :
- Lire 17 caractères
- Les transformer en float/double (var a)
- Lire 2 caractères
- Les transformer en float/double (var b)
- var b = b / 100
- var a = a + b
Je ne me souviens plus si on peut transformer directement une string en float ou double...
Au pire : d'abord passer par un int, puis le transformer en double/float (et effectuer la division après, évidemment )
EDIT : Je ne suis pas un expert Java, mais toutes ces opérations ne sont pas compliquées si je me souviens bien de mes bases Java !
--
Metalman !
Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
(ANSI retire quelques fonctions comme strdup...)
L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
Et s'assurer que la logique est bonne "aussi" !
Ma page Developpez.net
En fait la zone numérique signée contient par exemple :
"00000000001818678G"
S9(16) = 0000000000181867
V9(2) = 8G (le signe est contenu ici je pense)
Oula... le tout petit peu de COBOL que j'ai ne me permet pas de vous aider plus...
Dans la doc, en effet il est question de mettre le signe au début ou à la fin (leading/trailing), et avec ou sans espacement par rapport au chiffre...
Je n'ai pas trouvé de tableau avec la signification du G...
Je vais laisser les vrais expérimentés vous répondre
Mais pour parser, du coup, il suffira de changer quelques valeurs, et faire un switch/case sur le dernier caractère pour faire * (- 1) ou pas !
--
Metalman !
Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
(ANSI retire quelques fonctions comme strdup...)
L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
Et s'assurer que la logique est bonne "aussi" !
Ma page Developpez.net
Bonjour.
En S9(16)V9(02), "00000000001818678G" signifie que ton nombre est égal à +0000000000181867,87 (sans position pour le signe ni le point décimal); parce que le "G" est représenté par X"C7"(en EBCDIC) ou X"47" (en ASCII). Par défaut le signe est TRAILING non SEPARATE, il va donc se trouver dans le premier demi-octet (de gauche) du dernier octet. En EBCDIC, "F" et "C" pour indiquer l'absence de signe ou le signe positif, tout autre caractère indique le signe négatif, entre autres le "D".
AMHA, et pour éviter une usine à gaz, il faudrait peut être penser à changer à l'interface qui génère le fichier texte pour générer le nombre en étendu avec signe SEPARATE LEADING ou TRAILING (le point décimal n'occupe pas de place et est interprété à la lecture selon le format qu'on veut) ou même directement en FLOAT Simple ou Double précision, des formats que Java pourra traiter sans s'arracher les cheveux.
Dans le premier cas, tu vas avoir ton nombre comme ceci : "+000000000018186787", il suffit de le considérer comme un string, le convertir en long integer puis le diviser par 100.
un autre moyen (mais c est très moche) est d'analyser ce dernier caractère, en fonction des conventions cobol, pour le signe plus un C est mis sur l'avant dernier demi octet , pour le signe moins un D.
aussi tu peux interpréter cette lettre comme :
é : le chiffre 0 signe + pour le montant total
A 1 +
B 2 +
C 3 +
D 4 +
E 5 +
F 6 +
G 7 +
H 8 +
I 9 +
J 1 signe - sur le montant total
K 2 -
L 3 -
M 4 -
N 5 -
O 6 -
P 7 -
Q 8 -
R 9 -
Pourquoi ne pas passer par une variable en redefines en +9(16),99 ?
ça mesure 21 de long et ce sera plus facile à parser
merci à tous pour vos réponses. Je crois que je vais parser en prenant en dur le caractère et en le remplaçant.
Pour info, je ne suis pas mettre de l'édition du fichier qui est généré par du Cobol. Il vient d'un service extérieur à ma boite.
Merci encore.
JMM
Les 4 règles d'airain du développement informatique sont, d'après Michael C. Kasten :
1)on ne peut pas établir un chiffrage tant qu'on a pas finalisé la conception
2)on ne peut pas finaliser la conception tant qu'on a pas complètement compris toutes les exigences
3)le temps de comprendre toutes les exigences, le projet est terminé
4)le temps de terminer le projet, les exigences ont changé
Et le serment de non-allégiance :
Je promets de n’exclure aucune idée sur la base de sa source mais de donner toute la considération nécessaire aux idées de toutes les écoles ou lignes de pensées afin de trouver celle qui est la mieux adaptée à une situation donnée.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager