Ich frage mich nur, ob .NET eine saubere Möglichkeit bietet, dies zu tun:
int64 x = 1000000;
string y = null;
if (x / 1024 == 0) {
y = x + " bytes";
}
else if (x / (1024 * 1024) == 0) {
y = string.Format("{0:n1} KB", x / 1024f);
}
etc...
Hier ist ein ziemlich prägnanter Weg, dies zu tun:
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]);
}
Und hier ist die ursprüngliche Implementierung, die ich vorgeschlagen habe. Sie ist zwar etwas langsamer, aber etwas einfacher zu befolgen:
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));
Eine Sache zu beachten - in der SI-Notation verwendet "Kilo" normalerweise einen Kleinbuchstaben k, während alle größeren Einheiten einen Großbuchstaben verwenden. Windows verwendet KB, MB, GB, daher habe ich oben KB verwendet, aber Sie können stattdessen kB in Betracht ziehen.
if (value == 0) { return "0"; }
Check innerhalb der Funktion hinzuzufügen .Überprüfen Sie die ByteSize- Bibliothek. Es ist das
System.TimeSpan
für Bytes!Es übernimmt die Konvertierung und Formatierung für Sie.
Es werden auch Zeichenfolgen dargestellt und analysiert.
quelle
Da alle anderen ihre Methoden veröffentlichen, dachte ich, ich würde die Erweiterungsmethode veröffentlichen, die ich normalerweise dafür verwende:
BEARBEITEN: Int / Long-Varianten hinzugefügt ... und ein Copypasta-Tippfehler behoben ...
quelle
Ich würde es lösen mit
Extension methods
,Math.Pow
Funktion undEnums
:und benutze es wie:
quelle
Die Kurzversion der am häufigsten gewählten Antwort hat Probleme mit TB-Werten.
Ich habe es entsprechend angepasst, um auch TB-Werte und immer noch ohne Schleife zu behandeln, und auch eine kleine Fehlerprüfung für negative Werte hinzugefügt. Hier ist meine Lösung:
quelle
Nein, hauptsächlich, weil es ein Nischenbedürfnis ist und es zu viele mögliche Variationen gibt. (Ist es "KB", "Kb" oder "Ko"? Ist ein Megabyte 1024 * 1024 Bytes oder 1024 * 1000 Bytes? - Ja, einige Orte verwenden das!)
quelle
Hier ist eine Option, die einfacher zu erweitern ist als Ihre, aber nein, es ist keine in die Bibliothek selbst integriert.
quelle
Dies ist auch eine Möglichkeit (die Nummer 1073741824.0 ist von 1024 * 1024 * 1024 aka GB)
quelle
@ Servys Antwort war nett und prägnant. Ich denke es kann noch einfacher sein?
quelle
Basierend auf der eleganten Lösung von NeverHopeless:
Vielleicht gibt es übermäßige Kommentare, aber ich neige dazu, sie zu hinterlassen, um zu verhindern, dass ich bei zukünftigen Besuchen dieselben Fehler mache ...
quelle
Nein.
Aber Sie können so implementieren;
Lesen Sie auch Wie konvertiere ich die Dateigröße in Bytes korrekt in Mega oder Gigabyte?
quelle
Ich habe einige der Antworten hier zu zwei Methoden zusammengefasst, die hervorragend funktionieren. Die zweite Methode unten konvertiert von einer Byte-Zeichenfolge (wie 1,5,1 GB) zurück in Bytes (wie 1621350140) als langen Typwert. Ich hoffe, dies ist nützlich für andere, die nach einer Lösung suchen, um Bytes in einen String und zurück in Bytes umzuwandeln.
quelle
float.Parse
sinddouble
?Ich weiß, das ist schon ein alter Thread. aber vielleicht wird jemand nach einer Lösung suchen. Und hier ist was ich benutze und der einfachste Weg
quelle
Wie wäre es mit:
ZB gerne anrufen
Wird zur Ausgabe führen
quelle
Ich habe mich für JerKimballs Lösung entschieden und Daumen hoch. Ich möchte jedoch hinzufügen / darauf hinweisen, dass dies in der Tat insgesamt kontrovers diskutiert wird. Bei meinen Recherchen (aus anderen Gründen) habe ich die folgenden Informationen gefunden.
Wenn normale Menschen (ich habe gehört, dass sie existieren) von Gigabyte sprechen, beziehen sie sich auf das metrische System, bei dem 1000 hoch 3 aus der ursprünglichen Anzahl von Bytes == der Anzahl von Gigabyte. Natürlich gibt es jedoch die IEC / JEDEC-Standards, die in Wikipedia gut zusammengefasst sind. Statt 1000 hoch x haben sie 1024. Was für physische Speichergeräte (und ich denke logisch wie Amazon und andere) eine bedeutet Immer größerer Unterschied zwischen Metrik und IEC. So ist beispielsweise 1 TB == 1 Terabyte-Metrik 1000 hoch 4, aber IEC bezeichnet die ähnliche Zahl offiziell als 1 TiB, tebibyte als 1024 hoch 4. Aber leider in nicht-technischen Anwendungen (würde ich Die Norm ist metrisch, und in meiner eigenen App für den internen Gebrauch erkläre ich derzeit den Unterschied in der Dokumentation. Aber zu Anzeigezwecken biete ich nicht einmal etwas anderes als Metrik an. Intern, obwohl es in meiner App nicht relevant ist, speichere ich nur Bytes und führe die Berechnung für die Anzeige durch.
Als Randnotiz finde ich es etwas mangelhaft, dass das .Net-Framework AFAIK (und ich irre mich häufig, danke an die vorhandenen Kräfte) selbst in seiner 4.5-Inkarnation in keiner internen Bibliothek etwas darüber enthält. Man würde erwarten, dass eine Open-Source-Bibliothek irgendwann NuGettable sein wird, aber ich gebe zu, dass dies ein kleiner Ärger ist. Andererseits haben System.IO.DriveInfo und andere auch nur Bytes (so lang), was ziemlich klar ist.
quelle
https://github.com/logary/logary/blob/master/src/Logary/DataModel.fs#L832-L837
quelle
quelle
Wie wäre es mit einer Rekursion:
Dann können Sie es nennen:
quelle
Wie oben angegeben, ist die Rekursion mithilfe des Logarithmus der bevorzugte Weg.
Die folgende Funktion hat 3 Argumente: die Eingabe, die Dimensionsbeschränkung der Ausgabe, das ist das dritte Argument.
Lassen Sie uns nun 12 GB RAM in mehrere Einheiten konvertieren:
quelle
Ich benutze dies für Windows (binäre Präfixe):
quelle
Ich habe dies (mit wenig bis gar keiner Änderung) in einen UWP DataBinding Converter für mein Projekt integriert und dachte, es könnte auch für andere nützlich sein.
Der Code lautet:
Fügen Sie Ihrem UserControl oder Ihrer Page XAML eine lokale Ressource hinzu, um sie zu verwenden:
Verweisen Sie in einer Datenbindungsvorlage oder Datenbindungsinstanz darauf:
Und hey Presto. Die Magie passiert.
quelle