我有一个值存储在一个"long"类型的变量中。
long fileSizeInBytes = FileUploadControl.FileContent.Length;
Decimal fileSizeInMB = Convert.ToDecimal(fileSizeInBytes / (1024 * 1024));
我想将fileSizeInBytes转换为四舍五入到小数点后2位的十进制数字(如:1.74,2.45,3.51),但我无法得到所需的结果。得到的结果是个位数,没有小数。有谁能帮我一下吗?
感谢期待
Decimal fileSizeInMB = Convert.ToDecimal(fileSize) / (1024.0m * 1024.0m);
你所做的是将文件大小除以一个整数,结果是一个整数,而不是一个小数。剩余部分将被截断。
我没有看到任何地方声明的fileSize
-但我要假设它是一个很长的。因此,fileSize / (1024 * 1024)
被强制转换为一个不包含任何小数点的长值所以你会得到这样的结果:
Convert.ToDecimal(someLongValue)
没有小数点。在传递给Convert.ToDecimal
可能有点晚了,但这里你已经或多或少地满足了你需要的文件大小瓦特等
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Globalization;
using System.Runtime.InteropServices;
using System.Threading;
namespace ConsoleApplication1
{
class Program
{
/// <summary>
/// Formats the given size to the order of magniture given
/// Order is 1 for KB, 2 for MB etc up to 8, after that you get exponents for the same notations
/// </summary>
/// <param name="size">The total size in bytes</param>
/// <param name="order">+1 for each 1024 B,M,... 0 for nothing</param>
/// <param name="unit">Usually you will want B for bytes denotation, but maybe "bit" or "bi" or W for watt</param>
/// <param name="decimal_places">Number of desired decimal places</param>
/// <param name="add_space">Separate KB MB etc from the number with a space?</param>
/// <returns>Formatted size</returns>
public static string FormatSize(string unit, double size, int order, int decimal_places, bool add_space) {
string[] suffixes = new string[] {"", "K","M","G","T","P","E","Z","Y"};
int exponent = order - 8 > 0 ? order - 8 : 0;
order -= exponent;
string suffix = suffixes[order];
while (order > 0) {
size /= 1024;
order--;
}
string sDecimals = new String('0', decimal_places);
string sExponent = exponent != 0 ? "E" + exponent : "";
string dot = decimal_places > 0 ? "." : "";
return size.ToString("#,##0" + dot + sDecimals + sExponent) + (add_space ? " " : "") + suffix + unit;
}
public static void Main(string[] Args)
{
Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
string sz;
sz = FormatSize("B", 1024, 1, 0, false);
Console.WriteLine(sz);
sz = FormatSize("B", 1024*1024 + 512, 1, 0, true);
Console.WriteLine(sz);
sz = FormatSize("W", 1024 * 1024 + 512, 1, 2, true);
Console.WriteLine(sz);
sz = FormatSize("B", 1024 * 1024 + 512, 2, 2, true);
Console.WriteLine(sz);
sz = FormatSize("B", 1024 * 1024 * 1024 + 1024 * 1024 * 1024 / 2, 3, 0, false);
Console.WriteLine(sz);
sz = FormatSize("bit", 1024 * 1024 * 1024 + 1024 * 1024 * 1024 / 2, 3, 1, false);
Console.WriteLine(sz);
sz = FormatSize("B", 1024 * 1024 * 1024 + 1024 * 1024 * 1024 / 2 - 1, 3, 2, false);
Console.WriteLine(sz);
sz = FormatSize("Ω", 1024 * 1024 * 1024 + 1024 * 1024 * 1024 / 2 - 1, 3, 1, false);
Console.WriteLine(sz);
sz = FormatSize("B", 1024 * 1024 * 1024 + 1024 * 1024 * 1024 / 2 - 10000000, 3, 2, false);
Console.WriteLine(sz);
sz = FormatSize("B", 1024 * 1024 * 1024 + 1024 * 1024 * 1024 / 2 - 1, 3, 0, false);
Console.WriteLine(sz);
sz = FormatSize("bit", 1208925819614629174706176f, 9, 2, true);
Console.WriteLine(sz);
}
}
}
下面是一些输出:
1KB
1,025 KB
1,024.50 KW
1.00 MB
2GB
1.5Gbit
1.50GB
1.5GΩ
1.49GB
1GB
1.00E1 Ybit
下面是我用来显示文件大小的函数
//---------------------------------------------------------------------------------------------------------------------------------
/// <summary>
/// Formats from bytes to KB,MB,GB,TB
/// </summary>
/// <param name="number">Bytes to format</param>
/// <returns></returns>
public static string AutoFileSize(long number)
{
double tmp = number;
string suffix = " B ";
if (tmp > 1024) { tmp = tmp / 1024; suffix = " KB"; }
if (tmp > 1024) { tmp = tmp / 1024; suffix = " MB"; }
if (tmp > 1024) { tmp = tmp / 1024; suffix = " GB"; }
if (tmp > 1024) { tmp = tmp / 1024; suffix = " TB"; }
return tmp.ToString("n") + suffix;
}