Me pregunto si .NET proporciona una forma limpia de hacer esto:
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 ...
Aquí hay una forma bastante concisa de hacer esto:
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]);
}
Y aquí está la implementación original que sugerí, que puede ser un poco más lenta, pero un poco más fácil de seguir:
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));
Una cosa a tener en cuenta: en la notación SI, "kilo" generalmente usa una k minúscula, mientras que todas las unidades más grandes usan una letra mayúscula. Windows usa KB, MB, GB, por lo que he usado KB arriba, pero puede considerar kB en su lugar.
if (value == 0) { return "0"; }
cheque dentro de la función.Partida de los ByteSize biblioteca. Es el
System.TimeSpan
de bytes!Maneja la conversión y el formato por usted.
También realiza representación y análisis de cadenas.
fuente
Dado que todos los demás están publicando sus métodos, pensé que publicaría el método de extensión que suelo usar para esto:
EDITAR: se agregaron variantes int / long ... y se corrigió un error tipográfico de copypasta ...
fuente
Lo resolvería usando
Extension methods
,Math.Pow
función yEnums
:y utilícelo como:
fuente
La versión corta de la respuesta más votada tiene problemas con los valores de TB.
Lo ajusté adecuadamente para manejar también los valores tb y aún sin un bucle, y también agregué una pequeña verificación de errores para valores negativos. Esta es mi solución:
fuente
No. Principalmente porque se trata de una necesidad bastante específica y hay demasiadas variaciones posibles. (¿Es "KB", "Kb" o "Ko"? ¿Es un megabyte 1024 * 1024 bytes o 1024 * 1000 bytes? - ¡Sí, algunos lugares lo usan!)
fuente
Aquí hay una opción que es más fácil de ampliar que la suya, pero no, no hay ninguna integrada en la biblioteca.
fuente
Esta es una forma de hacerlo también (el número 1073741824.0 es de 1024 * 1024 * 1024 también conocido como GB)
fuente
La respuesta de @ Servy fue agradable y concisa. ¿Creo que puede ser aún más sencillo?
fuente
Basado en la elegante solución de NeverHopeless:
Tal vez haya comentarios excesivos, pero suelo dejarlos para no cometer los mismos errores en futuras visitas ...
fuente
No.
Pero puedes implementarlo así;
Consulte también ¿Cómo convertir correctamente en bytes en mega o gigabytes?
fuente
He combinado algunas de las respuestas aquí en dos métodos que funcionan muy bien. El segundo método a continuación se convertirá de una cadena de bytes (como 1,5.1 GB) a bytes (como 1621350140) como un valor de tipo largo. Espero que esto sea útil para quienes busquen una solución para convertir bytes en una cadena y volver a convertirlos en bytes.
fuente
float.Parse
hacerlodouble
?Sé que este ya es un hilo antiguo. pero tal vez alguien busque una solución. Y esto es lo que uso y la forma más fácil
fuente
Qué tal si:
Por ejemplo, llamar como
Resultará en salida
fuente
Fui por la solución JerKimballs, y aprobé eso. Sin embargo, me gustaría añadir / señalar que, de hecho, se trata de una cuestión controvertida en su conjunto. En mi investigación (por otras razones) he encontrado la siguiente información.
Cuando la gente normal (he oído que existen) habla de gigabytes, se refiere al sistema métrico en el que 1000 elevado a 3 del número original de bytes == el número de gigabytes. Sin embargo, por supuesto, existen los estándares IEC / JEDEC que están muy bien resumidos en wikipedia, que en lugar de 1000 a la potencia de x tienen 1024. Lo que para dispositivos de almacenamiento físico (y supongo que lógicos como Amazon y otros) significa un Diferencia cada vez mayor entre el sistema métrico y el IEC. Entonces, por ejemplo, 1 TB == 1 terabyte métrica es 1000 elevado a 4, pero IEC califica oficialmente el número similar como 1 TiB, tebibyte a 1024 elevado a 4. Pero, por desgracia, en aplicaciones no técnicas (yo ir por audiencia) la norma es métrica, y en mi propia aplicación para uso interno actualmente explico la diferencia en la documentación. Pero para fines de visualización, ni siquiera ofrezco nada más que métricas. Internamente, aunque no es relevante en mi aplicación, solo almaceno bytes y hago el cálculo para la visualización.
Como nota al margen, me parece algo mediocre que el marco .Net AFAIK (y con frecuencia me equivoco gracias a los poderes), incluso en su encarnación 4.5, no contiene nada sobre esto en ninguna biblioteca internamente. Uno esperaría que una biblioteca de código abierto de algún tipo fuera NuGettable en algún momento, pero admito que esto es un pequeño inconveniente. Por otro lado, System.IO.DriveInfo y otros también solo tienen bytes (siempre que sean largos), lo cual es bastante claro.
fuente
fuente
¿Qué tal una recursividad?
Entonces puedes llamarlo:
fuente
Como se publicó anteriormente, la recursividad es la forma favorita, con la ayuda del logaritmo.
La siguiente función tiene 3 argumentos: la entrada, la restricción de dimensión de la salida, que es el tercer argumento.
Ahora convierta 12GB de RAM en varias unidades:
fuente
Yo uso esto para Windows (prefijos binarios):
fuente
He incorporado esto (con poca o ninguna modificación) en un UWP DataBinding Converter para mi proyecto y pensé que también podría ser útil para otros.
El codigo es:
Para usarlo, agregue un recurso local a su UserControl o Page XAML:
Haga referencia a él en una plantilla de enlace de datos o instancia de enlace de datos:
Y listo. La magia sucede.
fuente
https://github.com/logary/logary/blob/master/src/Logary/DataModel.fs#L832-L837
(DESCARGO DE RESPONSABILIDAD: escribí este código, ¡incluso el código en el enlace!)
fuente