Page 1 sur 1

Convertion octets en Mo

Publié : sam. 10/mai/2014 12:40
par Programmes
Bonjour à tous,

Je suis en train de faire un programme avec la version 5.22 pour calculer la taille d'un répertoire.
Voici ma fonction qui traduit la taille en texte:

Code : Tout sélectionner

Procedure.s Convertion(Item)
    Protected Txt.s
    Select Item
        Case 1:Taille=TailleRepertoire
        Case 2:Taille=TailleFichiers
    EndSelect
    ;unité sert à savoir dans qu'elle unité on veut convertir
    Select Unite
        Case 1;Go
            reste=Taille%1073741824
            If reste>0:Txt.s=StrF(Taille/(1073741824),2) :Else:TexteGo.s=StrF(Taille/(1073741824),0):EndIf:Txt=Txt+" Go"
        Case 2;Mo
            reste=Taille%1048576
            If reste>0:Txt=StrF(Taille/1048576 ,2) :Else:Txt=StrF(Taille/1048576 ,0):EndIf:Txt=Txt+" Mo"
        Case 3;Ko
            reste=Taille%1024
            If reste>0:TexteKo.s=StrF(Taille/1024 ,2) :Else:TexteKo.s=StrF(Taille/1024 ,0):EndIf:TexteKo=TexteKo+" Ko"
        Case 4:Txt=StrF(Taille)+" octets"
    EndSelect
   ProcedureReturn Txt
EndProcedure
Au lieu d'utiliser StrF(Taille/1048576 ,2) je voudrais remplacer le nombre de chiffre après la virgule en fonction du résultat...J'ai trouvé ceci sur internet:

Code : Tout sélectionner

If Taille >= 1000 : Unite = 1 : NbDecimals = 2 : EndIf
If Taille >= 10000 : Unite = 1 : NbDecimals = 1 : EndIf
If Taille >= 1000000 : Unite = 2 : NbDecimals = 2 : EndIf
If Taille >= 10000000 : Unite = 2 : NbDecimals = 1 : EndIf
If Taille >= 1000000000 : Unite = 3 : NbDecimals = 2 : EndIf
If Taille >= 10000000000 : Unite = 3 : NbDecimals = 1 : EndIf
Txt=StrF(Taille/1048576 ,NbDecimals)
Pour exemple, la taille de mon dossier fait 53.869.272 octets soit 51.37 Mo. Si je prends l'exemple trouvé sur internet, la fonction me retourne 51.4 ce qui veut dire que le résultat est arrondi.
Il n'y a pas un moyen d'éviter d'arrondir afin d'avoir le résultat escompté soit 51.37?
Je ne sais pas si je me fais bien comprendre...
Merci à tous pour vos réponse(s) et bonne journée!

Re: Convertion octets en Mo

Publié : sam. 10/mai/2014 12:46
par Backup
regarde la doc a Strf()
la taille de mon dossier fait 53.869.272 octets soit 51.37 Mo.
heu t'as bu quoi au ptit dej ??

53.869 ça devrai faire 53.87 au mieux ..... surement pas 51.37 8O


ps: si tu ne veux pas arrondir, utilise Left() ou Mid()

voir meme StringField()

Re: Convertion octets en Mo

Publié : sam. 10/mai/2014 12:56
par GallyHC
Bonjour,

J'avais fait une version sans trop de test inutile cela donne :

Page du source :
http://www.pbfrance.com/?url=source&cmd=viewer&val=1

Code direct :
http://www.pbfrance.com/php/form_source ... .php?num=1

Cordialement,
GallyHC

Re: Convertion octets en Mo

Publié : sam. 10/mai/2014 13:39
par Programmes
Merci à tous pour vos réponses...
Pour la conversion, j'ai utilisé un convertisseur sur internet. Je m'empresse d'utiliser les infos...

Re: Convertion octets en Mo

Publié : sam. 10/mai/2014 13:53
par GallyHC
Bonjour,

Dobro > en divisant par 1024 et en arrondissant avec ma routine j'ai bien "51.4 Mo".

Cordialement,
GallyHC

Re: Convertion octets en Mo

Publié : sam. 10/mai/2014 13:57
par Backup
je parlais de l'arrondis de ce nombre :53.869 ..........ça devrai faire 53.87
mais effectivement, j'ai omis qu'il s'agissait d'octets ... :mrgreen:

Re: Convertion octets en Mo

Publié : sam. 10/mai/2014 14:02
par GallyHC
:mrgreen: allez tu es pardonné ;)

Re: Convertion octets en Mo

Publié : sam. 10/mai/2014 14:38
par MLD
Salut a tous

Une autre façon de faire

Code : Tout sélectionner

Procedure.s EXPLORER_ConvertSize2(chiffre.d)
 ch2.d = chiffre.d/1024 
 a$ = StrD(ch2.d,3) 
 I = 0    
 For X = 1 To Len(a$)
   If Mid(a$,X,1) ="."
     Break
   EndIf
   I = I + 1
 Next
 j$ = ""
 Select I
  Case 1   
     If ch2.d < 1
      J$ = "O"
     Else
      J$ = "Ko"
    EndIf 
  Case 2 To 3
      J$ = "Ko" 
  EndSelect  
  ProcedureReturn a$ + " " + j$
EndProcedure
Debug EXPLORER_ConvertSize2(1020000)		

Je te laisse terminé a +

Re: Convertion octets en Mo

Publié : sam. 10/mai/2014 14:50
par Programmes
Le mid était une bonne solution...J'ai fais ceci:

Code : Tout sélectionner

Taille=63481424
resultat.s=StrF(Taille/(1024*1024),2)
t.s=Mid(resultat,FindString(resultat,".")+2)
r=Val(t)
If r>0 And r<10:Unite=1:Else:Unite=0:EndIf
t.s=Mid(resultat,FindString(resultat,".")+1,1):r=Val(t)
If r>0 And r<10:Dizaine=1:Else:Dizaine=0:EndIf
If Unite>0
    If DIzaine>0:NbDecimale=2:EndIf
ElseIf Dizaine>0
    NbDecimale=1
Else:NbDecimale=0:EndIf
If NbDecimale=2:Txt.s=Left(resultat,FindString(resultat,".")+NbDecimale)
ElseIf NbDecimale=1:Txt.s=Left(resultat,FindString(resultat,".")+NbDecimale)
Else:Txt.s=Left(resultat,FindString(resultat,".")-1):EndIf
çà marche mais je m'empresse d'essayer la solution de MLD.
A+