Python format de la taille de l'application (la conversion de B en KO, MO, GO, TO)
Je suis en train d'écrire une application pour convertir des octets ko mo go à la tuberculose.
Voici ce que j'ai à ce jour:
def size_format(b):
if b < 1000:
return '%i' % b + 'B'
elif 1000 <= b < 1000000:
return '%.1f' % float(b/1000) + 'KB'
elif 1000000 <= b < 1000000000:
return '%.1f' % float(b/1000000) + 'MB'
elif 1000000000 <= b < 1000000000000:
return '%.1f' % float(b/1000000000) + 'GB'
elif 1000000000000 <= b:
return '%.1f' % float(b/1000000000000) + 'TB'
Le problème c'est que quand j'essaie de l'application je reçois tout ce qui est après la virgule zéro.
exemple
size_format(623)
rendements
'623B'
mais avec size_format(6200)
,
au lieu d'être "6.2 kb'
Je me fais '6.0 kb'.
Des idées pourquoi?
Un indice pour l'avenir: lorsque vous collez le dans le code, sélectionnez tout et utiliser le
{}
bouton pour les mettre en forme dans le code.OriginalL'auteur user1687654 | 2012-09-21
Vous devez vous connecter pour publier un commentaire.
Version fixe de Bryan_Rch réponse:
OriginalL'auteur Pietro Battiston
De sortie:
et pour l'avenir, moi, ici, il est en Perl:
OriginalL'auteur whereisalext
J'ai tout à fait lisible de la fonction de convertir des octets en plus de parts:
OriginalL'auteur Grzegorz Bazior
Plutôt que de modifier votre code, vous pouvez modifier le comportement de la division:
Cette offre "vrai" de la division sur le style "classique" que Python 2.x utilise. Voir PEP 238 - la Modification de l'Opérateur de Division pour plus de détails.
C'est maintenant le comportement par défaut de Python 3.x
OriginalL'auteur Matthew Trevor
C'est une version compacte qui convertit B (octets) pour tout ordre supérieur tels MO, GO, sans l'aide de beaucoup de
if...else
en python. J'utilise bit-wise. Cela permet aussi de retour d'une sortie float si vous déclenchez le paramètrereturn_output
dans la fonction comme Vrai:Ce n'est que quelques-uns de mes posts dans StackOverflow. S'il vous plaît laissez-moi savoir si j'ai des erreurs ou des violations.
OriginalL'auteur Mobieus Jay
Encore un autre humanbytes version, sans boucles/if..else, en python3 syntaxe.
Test numéros de vol de @whereisalext de réponse.
Vous l'esprit, c'est encore une esquisse, par exemple, si les numéros sont assez grand il sera traceback.
Résultats:
OriginalL'auteur petre
Lorsque vous divisez la valeur que vous utilisez une division d'entier, car les deux valeurs sont des nombres entiers. Vous avez besoin de convertir l'un d'eux à flotteur première:
ou même juste
OriginalL'auteur Mark Ransom
Ne float(b) avant de faire la division, par exemple, ne
float(b)/1000
au lieu defloat(b/1000)
, parce que les deuxb
et 1000 sont des nombres entiers,b/1000
est toujours un entier sans partie décimale.OriginalL'auteur Marcus
Ici est de convertir les octets en kilo, mega, tera.
get_(1.1 * 10**9)
OriginalL'auteur Bryan_Rch
bonne idée pour moi:
OriginalL'auteur iHTCboy
Une sortie avec pas de décimale:
OriginalL'auteur Helio Santos