Page 1 sur 2

Formater un grand nombre

Publié : jeu. 16/oct./2008 3:17
par Guimauve
Bonjour à tous,

J'ai eu besoin d'un commande pour formater un grand nombre. C'est-à-dire que le nombre 1000 est transformé en 1 000, le nombre 100000 devient 100 000.

Je donne le code, s'il peut être utile à quelqu'un..

A+
Guimauve

Code : Tout sélectionner

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Nom du projet : Librairie
; Fichier : FormatBigNumber.pb
; Version : 1.0.0
; Programmation : OK
; Programmé par : Guimauve
; Date : 15-10-2008
; Mise à jour : 15-10-2008
; Codé avec PureBasic V4.30 BETA 3
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

Procedure.s FormatBigNumber(Number.q)
  
  Car = 1
  String.s = Str(Number)
  
  Longueur = Len(String)
  
  Dim Digit.s(Longueur)
  
  String2.s = String
  
  While String2 <> ""
    
    String2 = Mid(String, Car, 1)
    
    Digit(Car - 1) = String2
    Car + 1
    
  Wend
  
  loop = -1
  
  For Index = Longueur To 0 Step -1
    
    If loop < 3
      
      Formatted.s = Digit(Index) + Formatted 
      loop + 1
      
    Else 
      
      Formatted.s = Digit(Index) + " " + Formatted
      loop = 1
      
    EndIf
    
  Next
  
  ProcedureReturn Formatted
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< CODE D'ESSAI <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<

Debug FormatBigNumber(1000)
Debug FormatBigNumber(10000)
Debug FormatBigNumber(100000)
Debug FormatBigNumber(1000000)
Debug FormatBigNumber(10000000)
Debug FormatBigNumber(100000000)
Debug FormatBigNumber(1000000000)
Debug FormatBigNumber(10000000000)
Debug FormatBigNumber(100000000000)
Debug FormatBigNumber(1000000000000)
Debug FormatBigNumber(10000000000000)
Debug FormatBigNumber(100000000000000)

; <<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< FIN DU FICHIER <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<

Publié : jeu. 16/oct./2008 5:30
par venom
merci Guimauve pour cette procédure sa pourrai toujours servir un de ces quarte :wink: .



@++

Publié : jeu. 16/oct./2008 7:31
par Kwai chang caine
Merci :wink:

Publié : jeu. 16/oct./2008 7:32
par Kwai chang caine
Merci :wink:

Publié : jeu. 16/oct./2008 9:48
par Backup
..............

Publié : jeu. 16/oct./2008 14:19
par gnozal
Ou comme çà :

Code : Tout sélectionner

Procedure.s FormatInteger(Number.s)
  Protected NumberLen = Len(Number), Start = NumberLen % 3, FormatedNumber.s, i
  FormatedNumber = Left(Number, Start)
  For i = Start + 1 To NumberLen - Start Step 3
    FormatedNumber + " " + Mid(Number, i, 3)
  Next
  ProcedureReturn LTrim(FormatedNumber)
EndProcedure





Debug RSet(FormatInteger("1"), 14, " ")
Debug RSet(FormatInteger("12"), 14, " ")
Debug RSet(FormatInteger("123"), 14, " ")
Debug RSet(FormatInteger("1234"), 14, " ")
Debug RSet(FormatInteger("12345"), 14, " ")
Debug RSet(FormatInteger("123456"), 14, " ")
Debug RSet(FormatInteger("1234567"), 14, " ")
Debug RSet(FormatInteger("12345678"), 14, " ")
Debug RSet(FormatInteger("123456789"), 14, " ")
Debug RSet(FormatInteger("1234567890"), 14, " ")
Debug RSet(FormatInteger("12345678901"), 14, " ")

Publié : jeu. 16/oct./2008 14:46
par Backup
joli !! :)

Publié : jeu. 16/oct./2008 15:09
par Kwai chang caine
On se demande pourquoi FREDO y se decarcasse a creer noire d'instructions, puisque GNOZAL il en utilise un minimum :lol: :lol:

Publié : jeu. 16/oct./2008 22:35
par PAPIPP
Et comme cela trouvé sur le forun anglais

Code : Tout sélectionner

Procedure.s StrNum(Number.s, decimal.l = 2) ; Formats a number string as a number string customized for a specified locale.
  Protected result.s, fmt.NUMBERFMT
  fmt\NumDigits = decimal ; Specifies the number of fractional digits.
  fmt\LeadingZero = 0       ; Specifies whether to use leading zeroes in decimal fields.
  fmt\Grouping = 3       ; Specifies the size of each group of digits to the left of the decimal.
  fmt\lpDecimalSep = @"."    ; Pointer to a null-terminated decimal separator string.
  fmt\lpThousandSep = @" "    ; Pointer to a null-terminated thousand separator string.
  fmt\NegativeOrder = 1       ; Specifies the negative number mode (LOCALE_INEGNUMBER).
  result = Space(GetNumberFormat_(0, 0, Number, fmt, 0, 0))
  GetNumberFormat_(0, 0, Number, fmt, @result, Len(result))
  ProcedureReturn result
EndProcedure

Macro StrNumL(Number) : StrNum(Str(Number), 0) : EndMacro
Macro StrNumF(Number) : StrNum(StrF(Number), 4) : EndMacro
Macro StrNumD(Number) : StrNum(StrD(Number), 8) : EndMacro
Macro StrNumQ(Number) : StrNum(StrQ(Number), 0) : EndMacro

Debug StrNumD(-112233445566.778899)
Debug StrNumD(-11223344556600.778899)
Debug Strnumq(1000)
Debug strnumq(10000)
Debug strnumq(100000)
Debug strnumq(1000000)
Debug strnumq(10000000)
Debug strnumq(100000000)
Debug strnumq(1000000000)
Debug strnumq(10000000000)
Debug strnumq(100000000000)
Debug strnumq(1000000000000)
Debug strnumq(10000000000000)
Debug strnumq(100000000000000)
:P

Publié : jeu. 16/oct./2008 23:29
par Le Soldat Inconnu
Dans le même genre de procedure, mais pour les taille de fichier, pour mettre en kb, mb, ou gb

Code : Tout sélectionner

Procedure.s DisplaySize(Taille.q, Unite.l = -1, NbDecimals.l = 0)
  ; Taille = taille du lecteur
  ; Unite = unité de la taille, 0 = Octect, 1 = Ko, 2 = Mo, 3 = Go. Si = -1, Le choix de l'unité et du nombre de décimal sera automatique
  ; NbDecimals = nombre de chiffre après la virgule.
  
  Protected Val.q, Txt.s
  
  If Unite = -1
    NbDecimals = 0 : Unite = 0
    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
  EndIf
  Select Unite
    Case 0 : Val = 1 : Txt = " octets"
    Case 1 : Val = 1024 : Txt = " Ko"
    Case 2 : Val = 1024 * 1024 : Txt = " Mo"
    Case 3 : Val = 1024 * 1024 * 1024 : Txt = " Go"
  EndSelect
  ProcedureReturn StrF(Taille / Val, NbDecimals) + Txt
  
EndProcedure


Debug DisplaySize(100)
Debug DisplaySize(1000)
Debug DisplaySize(10000)
Debug DisplaySize(100000)
Debug DisplaySize(1000000)
Debug DisplaySize(10000000)
Debug DisplaySize(100000000)
Debug DisplaySize(1000000000)
Debug DisplaySize(10000000000)
Debug DisplaySize(100000000000)
Debug DisplaySize(1000000000000)

Heu, question bête, Tera Octet, ca fait To ?, je l'ai jamais vu ce truc la

Publié : jeu. 16/oct./2008 23:36
par Backup
Le Soldat Inconnu a écrit : Heu, question bête, Tera Octet, ca fait To ?, je l'ai jamais vu ce truc la
oui !! :)

d'ailleurs au train ou vont les capacités des disques durs , on parlera de tera octets d'ici 2 ans !! :)

Publié : ven. 17/oct./2008 0:08
par Guimauve
Dobro a écrit :
Le Soldat Inconnu a écrit : Heu, question bête, Tera Octet, ca fait To ?, je l'ai jamais vu ce truc la
oui !! :)

d'ailleurs au train ou vont les capacités des disques durs , on parlera de tera octets d'ici 2 ans !! :)
C'est déjà le cas en ce moment, je regarde pour changer mon PC et j'ai trouvé une offre pour un système avec 2 disques durs de 1 Tera octet d'espace chacun.

A+
Guimauve

Publié : ven. 17/oct./2008 7:58
par comtois
ça fait la même chose ce truc?

Je n'ai pas PB ici pour vérifier

Publié : ven. 17/oct./2008 17:03
par Le Soldat Inconnu
ca à la l'air mais avec une boucle de traitement qui marche en lançant 36 fois la meme procedure, plutot gourmand. Je penche plus pour la solution de Gnozal

Re: Formater un grand nombre

Publié : sam. 12/mai/2012 21:12
par NY152
Les calculs sont faussés je trouve.

1 Ko = 1024 octets
1 Mo = 1024 Ko

etc

Donc mettre des conditions :

If Taille >= 1000 ... <---- ben non pas bon, là on est pas encore à 1 Ko et les écarts se creusent avec la montée en taille et en unité.


Les conversions actuelles sont bonnes pour le format d'unité US où 1000 = 1 Kb etc ...

Pour référence :

1 kilo-octet (ko) = 210 octets = 1 024 o = 1 024 octets, soit 2 ^ 10
1 méga-octet (Mo)= 220 octets = 1 024 ko = 1 048 576 octets
1 giga-octet (Go) = 230 octets = 1 024 Mo = 1 073 741 824 octets
1 téra-octet (To) = 240 octets = 1 024 Go = 1 099 511 627 776 octets
1 péta-octet (Po) = 250 octets = 1 024 To = 1 125 899 906 842 624 octets
1 exa-octet (Eo) = 260 octets = 1 024 Po = 1 152 921 504 606 846 976 octets
1 zetta-octet (Zo) = 270 octets = 1 024 Eo = 1 180 591 620 717 411 303 424 octets
1 yotta-octet (Yo) = 280 octets = 1 024 Zo = 1 208 925 819 614 629 174 706 176 octets