Berikut ini cara yang cukup ringkas untuk melakukan ini:
static readonly string[] SizeSuffixes =
{ "bytes", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB" };
static string SizeSuffix(Int64 value, int decimalPlaces = 1)
{
if (decimalPlaces < 0) { throw new ArgumentOutOfRangeException("decimalPlaces"); }
if (value < 0) { return "-" + SizeSuffix(-value); }
if (value == 0) { return string.Format("{0:n" + decimalPlaces + "} bytes", 0); }
// mag is 0 for bytes, 1 for KB, 2, for MB, etc.
int mag = (int)Math.Log(value, 1024);
// 1L << (mag * 10) == 2 ^ (10 * mag)
// [i.e. the number of bytes in the unit corresponding to mag]
decimal adjustedSize = (decimal)value / (1L << (mag * 10));
// make adjustment when the value is large enough that
// it would round up to 1000 or more
if (Math.Round(adjustedSize, decimalPlaces) >= 1000)
{
mag += 1;
adjustedSize /= 1024;
}
return string.Format("{0:n" + decimalPlaces + "} {1}",
adjustedSize,
SizeSuffixes[mag]);
}
Dan inilah implementasi asli yang saya sarankan, yang mungkin sedikit lebih lambat, tetapi sedikit lebih mudah diikuti:
static readonly string[] SizeSuffixes =
{ "bytes", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB" };
static string SizeSuffix(Int64 value, int decimalPlaces = 1)
{
if (value < 0) { return "-" + SizeSuffix(-value); }
int i = 0;
decimal dValue = (decimal)value;
while (Math.Round(dValue, decimalPlaces) >= 1000)
{
dValue /= 1024;
i++;
}
return string.Format("{0:n" + decimalPlaces + "} {1}", dValue, SizeSuffixes[i]);
}
Console.WriteLine(SizeSuffix(100005000L));
Satu hal yang perlu diingat - dalam notasi SI, "kilo" biasanya menggunakan huruf kecil k sedangkan semua unit yang lebih besar menggunakan huruf kapital. Windows menggunakan KB, MB, GB, jadi saya telah menggunakan KB di atas, tetapi Anda dapat mempertimbangkan kB.
if (value == 0) { return "0"; }
centang di dalam fungsi.Checkout ByteSize perpustakaan. Ini
System.TimeSpan
untuk byte!Ini menangani konversi dan pemformatan untuk Anda.
Itu juga melakukan representasi string dan parsing.
sumber
Karena semua orang memposting metode mereka, saya pikir saya akan memposting metode ekstensi yang biasanya saya gunakan untuk ini:
EDIT: menambahkan varian int / long ... dan memperbaiki kesalahan ketik copypasta ...
sumber
Saya akan menyelesaikannya menggunakan
Extension methods
,Math.Pow
fungsi danEnums
:dan gunakan seperti:
sumber
Versi singkat dari jawaban yang paling banyak dipilih memiliki masalah dengan nilai TB.
Saya menyesuaikannya dengan tepat untuk menangani juga nilai tb dan masih tanpa loop dan juga menambahkan sedikit pengecekan kesalahan untuk nilai negatif. Inilah solusi saya:
sumber
Tidak. Sebagian besar karena ini adalah kebutuhan yang khusus, dan ada terlalu banyak kemungkinan variasi. (Apakah itu "KB", "Kb" atau "Ko"? Apakah megabyte 1024 * 1024 byte, atau 1024 * 1000 byte? - ya, beberapa tempat menggunakannya!)
sumber
Berikut adalah opsi yang lebih mudah untuk diperluas daripada milik Anda, tetapi tidak, tidak ada yang ada di dalam perpustakaan itu sendiri.
sumber
Ini adalah salah satu cara untuk melakukannya juga (Nomor 1073741824.0 adalah dari 1024 * 1024 * 1024 alias GB)
sumber
Jawaban @ Servy bagus dan ringkas. Saya pikir itu bisa lebih sederhana?
sumber
Berdasarkan solusi elegan NeverHopeless:
Mungkin ada komentar yang berlebihan, tetapi saya cenderung meninggalkannya untuk mencegah diri saya membuat kesalahan yang sama pada kunjungan berikutnya ...
sumber
Tidak.
Tapi Anda bisa menerapkan seperti ini;
Lihat juga Bagaimana cara benar mengubah ukuran file dalam byte menjadi mega atau gigabyte?
sumber
Saya telah menggabungkan beberapa jawaban di sini menjadi dua metode yang bekerja dengan baik. Metode kedua di bawah ini akan mengonversi dari string byte (seperti 1,5.1 GB) kembali ke byte (seperti 1621350140) sebagai nilai tipe panjang. Saya harap ini berguna bagi orang lain yang mencari solusi untuk mengubah byte menjadi string dan kembali menjadi byte.
sumber
float.Parse
untukdouble
?Saya tahu ini adalah utas lama. tapi mungkin seseorang akan mencari solusinya. Dan inilah yang saya gunakan dan cara termudah
sumber
Bagaimana tentang:
Misalnya panggilan suka
Akan menghasilkan keluaran
sumber
Saya pergi untuk solusi JerKimballs, dan jempol untuk itu. Namun demikian, saya ingin menambahkan / menunjukkan bahwa ini memang merupakan kontroversi secara keseluruhan. Dalam penelitian saya (untuk alasan lain), saya mendapatkan informasi berikut.
Ketika orang normal (saya pernah mendengar mereka ada) berbicara tentang gigabyte, mereka mengacu pada sistem metrik di mana 1000 pangkat 3 dari jumlah asli byte == jumlah gigabyte. Namun, tentu saja ada standar IEC / JEDEC yang diringkas dengan baik di wikipedia, yang bukannya 1000 pangkat x mereka memiliki 1024. Yang untuk perangkat penyimpanan fisik (dan saya kira logis seperti amazon dan lainnya) berarti sebuah perbedaan yang semakin meningkat antara metrik vs IEC. Jadi misalnya 1 TB == 1 terabyte metrik adalah 1000 pangkat 4, tetapi IEC secara resmi menyebutkan angka yang sama sebagai 1 TiB, tebibyte sebagai 1024 pangkat 4. Namun, sayangnya, dalam aplikasi non-teknis (saya akan menurut audiens) normanya adalah metrik, dan di aplikasi saya sendiri untuk penggunaan internal saat ini saya menjelaskan perbedaan dalam dokumentasi. Tetapi untuk tujuan tampilan, saya bahkan tidak menawarkan apa pun kecuali metrik. Secara internal meskipun tidak relevan di aplikasi saya, saya hanya menyimpan byte dan melakukan perhitungan untuk tampilan.
Sebagai catatan tambahan, saya merasa agak kurang bersemangat bahwa kerangka kerja .Net AFAIK (dan saya sering salah terima kekuatan yang ada) bahkan dalam inkarnasinya 4,5 tidak mengandung apa pun tentang ini di perpustakaan mana pun secara internal. Orang akan mengharapkan perpustakaan sumber terbuka dari beberapa jenis menjadi NuGettable di beberapa titik, tapi saya akui ini adalah sedikit kesal. Di sisi lain System.IO.DriveInfo dan lainnya juga hanya memiliki byte (selama) yang agak jelas.
sumber
sumber
Bagaimana dengan beberapa rekursi:
Kemudian Anda dapat menyebutnya:
sumber
Seperti yang diposting di atas, rekursi adalah cara favorit, dengan bantuan logaritma.
Fungsi berikut memiliki 3 argumen: input, batasan dimensi output, itu adalah argumen ketiga.
Sekarang mari kita ubah RAM 12GB dalam beberapa unit:
sumber
Saya menggunakan ini untuk Windows (awalan biner):
sumber
Saya telah memasukkan ini (dengan sedikit atau tanpa modifikasi) ke dalam UWP DataBinding Converter untuk proyek saya dan berpikir itu mungkin juga berguna bagi orang lain.
Kodenya adalah:
Untuk menggunakannya, tambahkan sumber daya lokal ke UserControl atau Halaman XAML Anda:
Referensi dalam template data binding atau contoh data binding:
Dan hei presto. Keajaiban terjadi.
sumber
https://github.com/logary/logary/blob/master/src/Logary/DataModel.fs#L832-L837
(DISCLAIMER: Saya menulis kode ini, bahkan kode di tautan!)
sumber