2010-07-16 4 views
102

मुझे समझदार इकाइयों का उपयोग करके स्ट्रिंग के रूप में फ़ाइल आकार प्रदर्शित करने की आवश्यकता है।एमबी, जीबी आदि के रूप में प्रारूप फ़ाइल आकार

उदा

private static final long K = 1024; 
private static final long M = K * K; 
private static final long G = M * K; 
private static final long T = G * K; 

public static String convertToStringRepresentation(final long value){ 
    final long[] dividers = new long[] { T, G, M, K, 1 }; 
    final String[] units = new String[] { "TB", "GB", "MB", "KB", "B" }; 
    if(value < 1) 
     throw new IllegalArgumentException("Invalid file size: " + value); 
    String result = null; 
    for(int i = 0; i < dividers.length; i++){ 
     final long divider = dividers[i]; 
     if(value >= divider){ 
      result = format(value, divider, units[i]); 
      break; 
     } 
    } 
    return result; 
} 

private static String format(final long value, 
    final long divider, 
    final String unit){ 
    final double result = 
     divider > 1 ? (double) value/(double) divider : (double) value; 
    return String.format("%.1f %s", Double.valueOf(result), unit); 
} 

मुख्य:

1L ==> "1 B"; 
1024L ==> "1 KB"; 
2537253L ==> "2.3 MB" 

आदि

मैं this previous answer, जो मैं संतोषजनक नहीं मिला

मैं अपने खुद के समाधान के साथ आए हैं जो समान कमियों है पाया समस्या Decimalformat और/या String.format का मेरा सीमित ज्ञान है। मुझे 102412, 1025L आदि 1 KB पर 1.0 KB के बजाय मानचित्र करना होगा।

तो, दो संभावनाएं:

  1. मैं Apache Commons या गूगल अमरूद की तरह एक सार्वजनिक पुस्तकालय में एक अच्छा बाहर के बॉक्स समाधान पसंद करेंगे।
  2. , अगर वहाँ नहीं है किसी ने मुझे दिखा सकता है कि '.0' भाग से छुटकारा पाने के (स्ट्रिंग प्रतिस्थापन और regex का सहारा के बिना, मैं अपने आप को ऐसा कर सकते हैं)
+6

यह उत्तर देखें: http://stackoverflow.com/a/3758880/34088 –

+0

मुझे पता है। मैंने इसे स्वीकार कर लिया होगा, इसे यहां पोस्ट किया गया था। –

+0

यदि आप NumberFormat.getFormat ("#, ## 0। #") को वापस करने के लिए अंतिम पंक्ति बदलते हैं। प्रारूप (परिणाम) + "" + इकाई; यह जीडब्ल्यूटी में भी काम करता है! इसके लिए धन्यवाद, यह अभी भी गुवा में नहीं है। – tom

उत्तर

322
public static String readableFileSize(long size) { 
    if(size <= 0) return "0"; 
    final String[] units = new String[] { "B", "kB", "MB", "GB", "TB" }; 
    int digitGroups = (int) (Math.log10(size)/Math.log10(1024)); 
    return new DecimalFormat("#,##0.#").format(size/Math.pow(1024, digitGroups)) + " " + units[digitGroups]; 
} 

यह 1000 टीबी अप करने के लिए काम करेंगे .... और कार्यक्रम कम है!

+0

यह "सही" उत्तर होना चाहिए क्योंकि यह इकाई को ध्यान में रखता है। –

+3

सहमत हैं, सही जवाब होना चाहिए। देखो [यहां] (http://stackoverflow.com/questions/3758606/how-to-convert-byte-size-into-human-readable-format-in-java/3758880#3758880) एक बेहतर आउटपुट के लिए। – Kariem

+4

अंतिम स्ट्रिंग [] इकाइयों = नई स्ट्रिंग [] {"बी", "केबी", "एमबी", "जीबी", "टीबी", "ईबी"}; // अब यह Long.MAX_VALUE तक काम करता है! – Joe

7

आप शायद होगा java.text.DecimalFormat के साथ अधिक भाग्य। इस कोड को शायद यह करना चाहिए (बस हालांकि यह winging ...)

new DecimalFormat("#,##0.#").format(value) + " " + unit

+0

सही, धन्यवाद! –

2

आश्चर्यजनक रूप से मेरे लिए लेकिन लूप आधारित एल्गोरिदम लगभग 10% तेज है।

public static String toNumInUnits(long bytes) { 
    int u = 0; 
    for (;bytes > 1024*1024; bytes >>= 10) { 
     u++; 
    } 
    if (bytes > 1024) 
     u++; 
    return String.format("%.1f %cB", bytes/1024f, " kMGTPE".charAt(u)); 
} 
+1

सब कुछ नीचे आधारित लूप है। –