将“1.5TB”,“500MB”转换为单个文件大小的单位

我想允许用户使用任何标准后缀(例如TB,MB,GB)输入文件大小

我希望以一种可以将它们与文件夹大小进行比较的方式获取值。

我们的想法是让一个程序在文件夹超过一定大小时发出警告,其大小由用户输入的字符串决定。

.net框架中是否有任何内置允许我解析1.5TB400GB1.9GB0.5KB0.5KB

这是一个简单的口译员的好候选人。

像这样的代码是一个简单的开始,你需要处理更多的情况,并考虑套管的差异(例如Gb vs GB )。

首先是上下文和表达式的定义:

 public class FileSizeContext { private string input; private long output; public FileSizeContext(string input) { this.Input = input; } public string Input { get; set; } public long Output { get; set; } } public abstract class FileSizeExpression { public abstract void Interpret(FileSizeContext value); } 

然后定义终端表达式,以及所有变体:

 public abstract class TerminalFileSizeExpression : FileSizeExpression { public override void Interpret(FileSizeContext value) { if(value.Input.EndsWith(this.ThisPattern())) { double amount = double.Parse(value.Input.Replace(this.ThisPattern(),String.Empty)); var fileSize = (long)(amount*1024); value.Input = String.Format("{0}{1}",fileSize,this.NextPattern()); value.Output = fileSize; } } protected abstract string ThisPattern(); protected abstract string NextPattern(); } public class KbFileSizeExpression : TerminalFileSizeExpression { protected override string ThisPattern(){return "KB";} protected override string NextPattern() { return "bytes"; } } public class MbFileSizeExpression : TerminalFileSizeExpression { protected override string ThisPattern() { return "MB"; } protected override string NextPattern() { return "KB"; } } public class GbFileSizeExpression : TerminalFileSizeExpression { protected override string ThisPattern() { return "GB"; } protected override string NextPattern() { return "MB"; } } public class TbFileSizeExpression : TerminalFileSizeExpression { protected override string ThisPattern() { return "TB"; } protected override string NextPattern() { return "GB"; } } 

然后你添加一个非终端表达式(这可以完成大部分工作):

 public class FileSizeParser : FileSizeExpression { private List expressionTree = new List() { new TbFileSizeExpression(), new GbFileSizeExpression(), new MbFileSizeExpression(), new KbFileSizeExpression() }; public override void Interpret(FileSizeContext value) { foreach (FileSizeExpression exp in expressionTree) { exp.Interpret(value); } } } 

最后,这是一种客户端代码:

 var ctx = new FileSizeContext("10Mb"); var parser = new FileSizeParser(); parser.Interpret(ctx); Console.WriteLine("{0} bytes", ctx.Output); // 10485760 bytes 

实例: http : //rextester.com/rundotnet?code = WMGOQ13650

编辑。 从Mb改为MB(一个是官方MegaByte,另一个是MegaBit)。 将int更改为long以考虑大尺寸。

简答:不,没有内置方法。

答案很长:使用我的转换器。

 public class FileSizeConverter { private static System.Globalization.NumberFormatInfo numberFormat; private static Dictionary knownUnits; static FileSizeConverter() { knownUnits = new Dictionary { { "", 1L }, // no unit is same as unit B(yte) { "B", 1L }, { "KB", 1024L }, { "MB", 1024L * 1024L}, { "GB", 1024L * 1024L * 1024L}, { "TB", 1024L * 1024L * 1024L * 1024L} // fill rest as needed }; // since I live in a locale where "," is the decimal separator I will enforce US number format numberFormat = new System.Globalization.CultureInfo("en-US").NumberFormat; } public long Parse(string value) { // ignore spaces around the actual value value = value.Trim(); string unit = ExtractUnit(value); string sizeAsString = value.Substring(0, value.Length - unit.Length).Trim(); // trim spaces long multiplicator = MultiplicatorForUnit(unit); decimal size; if (!decimal.TryParse(sizeAsString, System.Globalization.NumberStyles.Number, numberFormat, out size)) throw new ArgumentException("illegal number", "value"); return (long)(multiplicator * size); } private bool IsDigit(char value) { // we don't want to use char.IsDigit since it would accept esoterical unicode digits if (value < '0') return false; if (value > '9') return false; return true; } private string ExtractUnit(string sizeWithUnit) { // start right, end at the first digit int lastChar = sizeWithUnit.Length-1; int unitLength = 0; while (unitLength <= lastChar && sizeWithUnit[lastChar - unitLength] != ' ' // stop when a space && !IsDigit(sizeWithUnit[lastChar - unitLength])) // or digit is found { unitLength++; } return sizeWithUnit.Substring(sizeWithUnit.Length - unitLength).ToUpperInvariant(); } private long MultiplicatorForUnit(string unit) { unit = unit.ToUpperInvariant(); if (!knownUnits.ContainsKey(unit)) throw new ArgumentException("illegal or unknown unit", "unit"); return knownUnits[unit]; } } 

编辑 :这里的现场演示: http ://rextester.com/rundotnet?code = BQYCB2587(感谢@Jamiec的链接,非常方便在线运行C#源码)

我在.NET Framework中使用快速Google搜索找不到这样的function,所以我想由你来实现它。

我认为将字符串分为数值和点(或逗号,国际化)作为第一部分,并将KB / MB /等作为第二部分提取并手动解析每个部分将是要走的路。