Défi et origine
Sur Stack Overflow, une question populaire est: Comment convertir la taille des octets en format lisible par l'homme en Java? La réponse la plus votée a une assez bonne méthode pour le faire, mais c'est du codegolf et nous pouvons faire mieux, n'est-ce pas?
Votre défi est d'écrire une méthode ou un programme qui couvre le nombre d'octets donné au format lisible par l'homme et imprime le résultat au standard dans votre langue. *
* Voir les règles pour plus de précisions!
Contribution
L'entrée sera toujours un nombre d'octets positif avec un maximum de (2 ^ 31) -1.
Production
Vous pouvez choisir si vous préférez le système international d'unités ou la notation binaire en sortie (la notation SI vous fait probablement économiser quelques octets).
SI: B, kB, MB, GB
Binary: B, KiB, MiB, GiB
Remarque: des unités supérieures à GB ou GiB ne sont pas possibles en raison de la plage d'entrée restreinte.
Exemple de sortie
Système international d'unités:
Input Output
0 0.0 B
999 999.0 B
1000 1.0 kB
1023 1.0 kB
1024 1.0 kB
1601 1.6 kB
160581 160.6 kB
4066888 4.1 MB
634000000 634.0 MB
2147483647 2.1 GB
Binaire:
Input Output
0 0.0 B
999 999.0 B
1000 1000.0 B
1023 1023.0 B
1024 1.0 KiB
1601 1.6 KiB
160581 156.8 KiB
4066888 3.9 MiB
634000000 604.6 MiB
2147483647 2.0 GiB
Règles
- Les fonctions intégrées de formatage d'octets ne sont pas autorisées!
- La sortie doit toujours être dans la même norme de notation, vous ne pouvez pas mélanger SI ou binaire;
- La sortie doit toujours être dans la plus grande unité possible lorsque le nombre résultant est toujours supérieur ou égal à un;
- La sortie doit toujours avoir un nombre décimal, mais vous pouvez choisir d'imprimer un nombre entier lorsque la sortie résultante est en octets (B);
- Vous pouvez choisir si vous souhaitez ajouter un espace, une tabulation ou rien entre le nombre et l'unité;
- L'entrée est reçue via STDIN ou les paramètres de fonction;
- La sortie est imprimée sur la console ou retournée sous forme de chaîne (ou conteneur de caractères similaire);
- C'est le golf de code, donc la réponse la plus courte l'emporte. S'amuser!
Edit: Encore plus de clarification
Certains nombres ont des comportements d'arrondi intéressants comme le nombre 999950. La plupart des implémentations de code renverraient 1000,0 ko au lieu de 1,0 Mo. Pourquoi? Parce que 999950/1000 est évalué à 999.950, ce qui est effectivement arrondi à 1000.0 lors de l'utilisation de String.format en Java (dans la plupart des autres langues également). Des contrôles supplémentaires sont nécessaires pour gérer des cas comme celui-ci.
Pour ce défi, les deux styles, 1000,0 ko et 1,0 Mo sont acceptés, bien que le dernier style soit préféré.
Pseudo code / code de test java:
public static String bytesToSI(long bytes){ if (bytes < 1000){ return bytes + ".0 B"; } //Without this rounding check: //999950 would be 1000.0 kB instead of 1.0 MB //999950000 would be 1000.0 MB instead of 1.0 GB int p = (int) Math.ceil(Math.log(bytes) / Math.log(1000)); if(bytes/Math.pow(1000, p) < 0.99995){ p--; } //Format return String.format("%.1f %sB", bytes/Math.pow(1000, p), "kMGTPE".charAt(p-1)); }
999999et 1000000? 160581les expositions doivent être arrondies, devrait-il en être 1000.0kBainsi 1.0MB?
kB(notez les k minuscules)