java - ২০১৯ - ফাইল আকার আকার এমবি, জিবি ইত্যাদি




ইত্যাদি ২০১৯ (2)

এই প্রশ্নটি ইতিমধ্যে একটি উত্তর আছে:

আমি বোধগম্য ইউনিট ব্যবহার করে স্ট্রিং হিসাবে একটি ফাইল আকার প্রদর্শন করতে হবে।

যেমন

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

প্রভৃতি

আমি এই পূর্ববর্তী উত্তর খুঁজে পেয়েছি, যা আমি সন্তোষজনক খুঁজে না

আমি আমার নিজের সমাধান নিয়ে এসেছি যার অনুরূপ ত্রুটি রয়েছে:

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);
}

মূল সমস্যাটি আমার ডিমিমফরম্যাট এবং / অথবা String.format এর সীমিত জ্ঞান। আমি 1024L, 1025L ইত্যাদি 1.0 KB পরিবর্তে 1 KB মানচিত্র করতে চাই।

সুতরাং, দুটি সম্ভাবনার:

  1. আমি পাবলিক লাইব্রেরিতে অ্যাপাচার কমন্স বা গুগল গুয়াভাতে একটি ভাল আউট-দ্য-বক্স সমাধান পছন্দ করি।
  2. যদি না থাকে তবে কেউ কি আমাকে '.0' অংশ থেকে পরিত্রাণ পেতে দেখাতে পারে (স্ট্রিং প্রতিস্থাপন এবং Regex ব্যবহার না করেই, আমি নিজে তা করতে পারি)

আপনি সম্ভবত java.text.DecimalFormat সঙ্গে আরো ভাগ্য আছে। এই কোড সম্ভবত এটি করা উচিত (শুধু যদিও এটি winging ...)

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


আমার জন্য বিস্ময়কর কিন্তু লুপ ভিত্তিক আলগোরিদিম প্রায় 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));
}




numbers