Forum Liberty Basic France

Subs et Snippets » Formater l'affichage d'un nombre ajout d'espaces et virgule au lieu du point
Le 08/05/2018 à 16h07

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 449
Avec l'instruction PRINT, Les résultats de calculs ne sont parfois pas très lisibles.

Par exemple, si je multiplie 12345 par 67890, j'obtiens 838102050.

C'est probablement très juste, mais ce serait plus clair si le résultat était :
838 102 050, où l'on lit tout de suite 838 milions.

L'instruction USING permet de formater l'affichage des nombres, mais, à la lecture de l'aide, on la trouve relativement limitée, et rien n'est prévu pour insérer des espaces dans l'affichage d'un nombre. Certes l'aide de JB/LB renvoie à l'aide de Microsoft Basic (QBasic, je suppose) pour plus d'informations, mais on n'est jamais mieux servi que par soi-même, et plutôt que de courir après l'aide de QBasic, je me suis programmé une petite fonction de formatage "à la française'.

Cette fonction travaille sur un nombre préalablement converti en chaîne de caractères, et c'est sur cette chaine qu'on prend les parties de trois chiffres, pour les placer au bon endroit dans une chaîne définitive comprenant signe, espaces, et au besoin, virgule.

Limitation relative aux grands nombres :
On atteint vite un seuil au-delà duquel un nombre est exprimé en notation scientifique.

Si on lance ce bout de code :
Code VB :
 
    a=1234567890123.456789
    print a
    a$=str$(a)
    print a$
 

on obtient 1.23456789e12 quand on fait print a, et la conversion de a en a$ reprend textuellement cette notation. Ce qui fait que la fonction de formatage renverra 1 234 567 890 000, il manquera 123.456789 (quelques milliardièmes...)

Ceci dit, si on présente la chaîne "1234567890123.456789" à la fonction, elle retournera bien "1 234 567 890 123,456 789"


Pour le formatage des nombres, je me suis appuyé sur ces recommandations : un espace pour séparer chaque tranche de 3 chiffres : milions, miliers, unités, puis un symbole décimal qui est la virgule, et un espace pour séparer milli, micros, nano,... Au fait, 'parait qu'on dit "une" espace.

Assez de blabla :
Code VB :
 
'Formater l'affichage d'un nombre quelconque en ... xxx xxx,xxx xxx ...

'saisie manuelle du nombre à formater
a$=""
while a$<>"q"
 
    input "entrer un nombre (ou q pour quitter) : ";a$
    if a$<>"" then print "nombre formaté : ";Fnombre$(a$)
    print
 
wend
 
print "programme achevé"
end
 
 
'******* fonctions et sous-programmes

function Fnombre$(a$)
 
    'choix du séparateur décimal
    separ$=","
 
    'détecter position du point et de la notation scientifique
    pt=0:e=0
    for a=1 to len(a$)
        b$=mid$(a$,a,1)
        if b$="." then pt=a
        if b$="e" then e=a
    next
 
    'cas du nombre en notation scientifique
    if e<>0 then '

        'présence du point
        if pt=0 then    'pas de point, nombre entier
            entiere$=left$(a$,e-1)
            decimale$=""
        else            'point, nombre décimal
            entiere$=left$(a$,pt-1)
            decimale$=mid$(a$,pt+1,e-pt-1)
        end if
 
        'déterminer la puissance de 10
        exposant$=right$(a$,len(a$)-e)
        expo=val(exposant$)
 
        'conversion en nombre entier du nombre fourni
        nombre1$=entiere$+decimale$
 
        'nombre de caractères
        longE=len(entiere$)
        longD=len(decimale$)
        longN=longE+longD
 
        'correction de la puissance de 10 dûe à la conversion en nombre entier
        nbchiffres=longE+expo
 
        'en fonction de la valeur de l'exposant
        select case
 
            case (nbchiffres<=0)    '"0."+ chaine de zéros + nombre1$
                nbzeros=abs(expo)-longE
                zeros$="0."
                for a=1 to nbzeros
                    zeros$=zeros$+"0"
                next
                nombre2$=zeros$+nombre1$
 
            case (nbchiffres>0) and (nbchiffres<longN)  'ex : "123.456"
                entiere1$=left$(nombre1$,nbchiffres)
                decimale1$=right$(nombre1$,longN-(nbchiffres))
                nombre2$=entiere1$+"."+decimale1$
 
            case (nbchiffres>0) and (nbchiffres=longN)  'ex : "123456"
                nombre2$=nombre1$
 
            case (nbchiffres>0) and (nbchiffres>longN) '"123456"+chaine de zéros
                nbzeros=abs(expo)-longD
                zeros$=""
                for a=1 to nbzeros
                    zeros$=zeros$+"0"
                next
                nombre2$=nombre1$+zeros$ 
 
            case else 'ne rien faire, pas d'issue prévue pour le moment
        end select
    else
        'notation usuelle
        nombre2$=a$
    end if
 
    'formatage du nombre

    'recherche position du point
    pospt=0 'position du point
    for carac=1 to len(nombre2$)
        if mid$(nombre2$,carac,1)="." then pospt=carac
    next
 
    'cas du nombre entier : on considère que la virgule est à la fin du nombre
    'mais on ne la rajoute pas au nombre
    affsepar=1  'à 1, on affichera le séparateur décimal, à zéro on ne l'affichera pas
    if pospt=0 then
        pospt=len(nombre2$)+1
        affsepar=0
    end if
 
    nbtr=int((pospt-1)/3)   'tranches complètes de 3 chiffres avant le point
    prtr=pospt-1-nbtr*3     'longueur de la première tranche
    deftif$=signe$+left$(nombre2$,prtr)+" "    'placer le signe et la première tranche dans la chaine définitive

    pos2d=prtr+1            'position seconde tranche

    'extraction des tranches 2 et suivantes jusqu'au point
    for carac=pos2d to pospt-1 step 3
        deftif$=deftif$+mid$(nombre2$,carac,3)+" "
    next
 
    'remplace le dernier espace par le séparateur décimal
    '   (s'il n'y a pas de point (nombre entier) on ignore le séparateur)
    if affsepar=1 then affsepar$=separ$ else affsepar$=""
    deftif$=left$(deftif$,len(deftif$)-1)+affsepar$
 
    'extraction des tranches suivantes depuis le point jusqu'à la fin de la chaine
    for carac=pospt+1 to len(nombre2$) step 3
        deftif$=deftif$+mid$(nombre2$,carac,3)+" "
    next
 
    'suppression de l'éventuel espace final
    if right$(deftif$,1)=" " then deftif$=left$(deftif$,len(deftif$)-1)
 
    Fnombre$=deftif$  'transfert du résultat à la fonction

end function
 




Edité par Christophe Le 08/05/2018 à 16h07
____________________
Just Basic :
  • utilisation courante avec Linux/Mageia6 + Wine (support partiel et quelques petites choses non implémentées dans l'aide mais pas trouvé d'incohérences ou de bug de compilation à ce jour)
  • utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc

   
Subs et Snippets » Formater l'affichage d'un nombre ajout d'espaces et virgule au lieu du point  

 |  |

1 Utilisateur en ligne : 0 Administrateur, 0 Modérateur, 0 Membre et 1 Visiteur
Utilisateur en ligne : Aucun membre connecté
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie