Formater un grand nombre

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Formater un grand nombre

Message 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 <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<
Avatar de l’utilisateur
venom
Messages : 3137
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Message par venom »

merci Guimauve pour cette procédure sa pourrai toujours servir un de ces quarte :wink: .



@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

Merci :wink:
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

Merci :wink:
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

..............
Dernière modification par Backup le dim. 02/oct./2011 13:09, modifié 1 fois.
gnozal
Messages : 832
Inscription : mar. 07/déc./2004 17:35
Localisation : France
Contact :

Message 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, " ")
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

joli !! :)
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message 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:
PAPIPP
Messages : 534
Inscription : sam. 23/févr./2008 17:58

Message 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
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message 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
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message 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 !! :)
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Message 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
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

ça fait la même chose ce truc?

Je n'ai pas PB ici pour vérifier
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message 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
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
NY152
Messages : 148
Inscription : dim. 14/mai/2006 20:41

Re: Formater un grand nombre

Message 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
.:NY152:.
Répondre