Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Vérifier un format [un peu long]

3 réponses
Avatar
chris
Bonjour,

je n'ai pas encore beaucoup cherché mais je vous pose la question
quand même après cela peut faire avancer le schmillblick.

Voila j'ai un fichier en bel ascii tout frais à découper en position fixe

La, python avec unpack c'est génial (unpack on dirait du perl ...)
extrait :

## Structure de l'entete
st_ENT = [
( 'TYPENREG', 2 ) ,
( 'DATETRAN', 10 ),
( 'CTIDEM', 3 ),
( 'CNFLUX', 2 ),
( 'NSTRAL', 5 )

...
## Pour les entetes
S_ENT = ''
TS_ENT = 0
for n,f in G.st_ENT:
#print "Nom = %s format = %s " % (n,f)
S_ENT += "%0ds " % f
TS_ENT += f
...
## traitement de l'Entete
try:
fmt_ent="%%%03ds" % TS_ENT
l = fmt_ent % ligs[0]
D_ENT = struct.unpack( S_ENT , l )
except:
L.log_f("STRUCT PB unpack Entete ")
status = 1

Et voila dans D_ENT j'ai un tableau contenant les valeurs
C'est peut être pas top mais facile a suivre et à modifier

Par contre maintenant je voudrais controler
que la zone TYPENREG ou NSTRAL est bien constituer de Chiffre
ou d'alpha ou de sequence correspondant a un numero de tel
ou valider une date

dans un langage que j'ai bien connu (que peut etre certain reconnaitront
ADONIX ) j'avais la fonction format$
ex:

format$("N:3.2", 12) => 12.00
format$("K:AAA", "ccc" ) => CCC ou " " je sais plus

bref on pouvait faire :

if ZONE <> format$(FMT, ZONE)
=> alors format pas respecté

en python

if ZONE != ( FMT % ZONE ):
=> idem

mais l'expression des formats est plutot simple voire simpliste

bref ya pas mieux que le % ?

Merci d'avance

Cordialement
C. BONNET

3 réponses

Avatar
JB
chris a écrit :
format$("N:3.2", 12) => 12.00
format$("K:AAA", "ccc" ) => CCC ou " " je sais plus

bref on pouvait faire :

if ZONE <> format$(FMT, ZONE)
=> alors format pas respecté

en python

if ZONE != ( FMT % ZONE ):
=> idem

mais l'expression des formats est plutot simple voire simpliste
bref ya pas mieux que le % ?




une petite regexp, avec le module re : http://www.amk.ca/python/howto/regex/

(et un pti coup de pouce depuis : http://regexlib.com/)
Avatar
Michel Claveau - NoSpam SVP ; merci
Bonjour !

Format n'est pas si mauvais que ça.
Exemple ci-dessous.

@-salutations
--
Michel Claveau





# -*- coding: utf-8 -*-

n34.5678
s="Nombre:%.2f(avec deux décimales)" % n
print s

n=-1234.5678
s="Nombre:%.2f(avec deux décimales)" % n
print s

n=-1234.5678
s="Nombre:%+.2f(avec deux décimales)" % n
print s

n34.5678
s="Nombre:%+.2f(avec deux décimales)" % n
print s

n=-1234.5678
s="Nombre:% .2f(notez l'espace après le %%)" % n
print s

n34.5678
s="Nombre:% .2f(notez l'espace après le %%)" % n
print s

n34.5678
s="Nombre:%11.2f(11 de largeur dont 2 décimales)" % n
print s

n34.5678
nbdecimales=3
s="Nombre:% .*f(nb de décimales variable)" % (nbdecimales,n)
print s

n34.5678
nbdecimales=3
largeur
s="Nombre:%*.*f(largeur et nb de décimales variables)" %
(largeur,nbdecimales,n)
print s

n34.5678
s="Nombre:%012.2f(largeur 12, 2 décimales, complété par des 0)" % n
print s

n34.5678
s="Nombre:%-12.2f(largeur 12, 2 décimales, aligné à gauche)" % n
print s

n34.5678901
s="String:%s(conversion implicite)" % n
print s

n34.5678901
s="String:%6s(la largeur ne tronque pas)" % n
print s

n34.56
s="String:%6f(la largeur ne tronque pas)" % n
print s


s="Entier:%d(sans décimales)" % n
print s

s="String:%s(sans conversion implicite)" % str(n)
print s

s="String:%s(avec conversion implicite)" % n
print s

n='ABCD'
s="String:%6s(largeur 6)" % n
print s

n='ABCD'
s="String:%-6s(largeur 6 cadrée à gauche)" % n
print s

nB
s="Caractère:%c(la valeur Ascii)" % n
print s

nB
s="Nombre:%o(valeur octale)" % n
print s

nB
s="Nombre:%x(valeur hexadécimale, lettre minuscule)" % n
print s

nB
s="Nombre:%X(valeur hexadécimale, lettre majuscule)" % n
print s

dico={'user':'Titi', 'server':'ServeurMCI', 'IPserver':'192.168.1.9',
'urlserver':'http://claveau.info'}
s="Le serveur %(server)s, dont le n° IP est %(IPserver)s, a pour url
%(urlserver)s ; OK ?" % dico
print s
Avatar
chris
Bonjour,

merci pour vos réponses, bon
les regexp => pourquoi pas, mais difficile a relire 3 mois après
le formats printf => pas assez riche mon fils ;-)

bref si j'ai le courage j'en fais une comme je veux et vous tiendrai
au courant (même si cela n'intéresse personne ... ;-) )

A+
chris