format.rs 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. static METRIC_PREFIXES: &'static [&'static str] = &[
  2. "", "K", "M", "G", "T", "P", "E", "Z", "Y"
  3. ];
  4. static IEC_PREFIXES: &'static [&'static str] = &[
  5. "", "Ki", "Mi", "Gi", "Ti", "Pi", "Ei", "Zi", "Yi"
  6. ];
  7. fn format_bytes(mut amount: f64, kilo: f64, prefixes: &[&str]) -> (String, String) {
  8. let mut prefix = 0;
  9. while amount >= kilo {
  10. amount /= kilo;
  11. prefix += 1;
  12. }
  13. if amount < 10.0 && prefix != 0 {
  14. (format!("{:.1}", amount), prefixes[prefix].to_string())
  15. }
  16. else {
  17. (format!("{:.0}", amount), prefixes[prefix].to_string())
  18. }
  19. }
  20. #[allow(non_snake_case_functions)]
  21. pub fn format_IEC_bytes(amount: u64) -> (String, String) {
  22. format_bytes(amount as f64, 1024.0, IEC_PREFIXES)
  23. }
  24. pub fn format_metric_bytes(amount: u64) -> (String, String) {
  25. format_bytes(amount as f64, 1000.0, METRIC_PREFIXES)
  26. }
  27. #[test]
  28. fn test_0() {
  29. let kk = format_metric_bytes(0);
  30. assert!(kk == ("0".to_string(), "".to_string()));
  31. }
  32. #[test]
  33. fn test_999() {
  34. let kk = format_metric_bytes(999);
  35. assert!(kk == ("999".to_string(), "".to_string()));
  36. }
  37. #[test]
  38. fn test_1000() {
  39. let kk = format_metric_bytes(1000);
  40. assert!(kk == ("1.0".to_string(), "K".to_string()));
  41. }
  42. #[test]
  43. fn test_1030() {
  44. let kk = format_metric_bytes(1030);
  45. assert!(kk == ("1.0".to_string(), "K".to_string()));
  46. }
  47. #[test]
  48. fn test_1100() {
  49. let kk = format_metric_bytes(1100);
  50. assert!(kk == ("1.1".to_string(), "K".to_string()));
  51. }
  52. #[test]
  53. fn test_1111() {
  54. let kk = format_metric_bytes(1111);
  55. assert!(kk == ("1.1".to_string(), "K".to_string()));
  56. }
  57. #[test]
  58. fn test_104857() {
  59. let kk = format_IEC_bytes(126456);
  60. assert!(kk == ("123".to_string(), "Ki".to_string()));
  61. }
  62. #[test]
  63. fn test_1048576() {
  64. let kk = format_IEC_bytes(1048576);
  65. assert!(kk == ("1.0".to_string(), "Mi".to_string()));
  66. }