VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > Python基础教程 >
  • 开源项目Humanizer介绍(4)

0.1d.ToMetric() => "100m" "1".FromMetric() => 1 "1.23k".FromMetric() => 1230 "100m".FromMetric() => 0.1

 

20、字节大小

Humanizer包含出色的ByteSize库的端口。 对ByteSize进行了许多更改和添加,以使与ByteSize的交互更容易且与Humanizer API更加一致。 这是一些如何从数字转换为字节大小以及在大小幅值之间转换的示例:

var fileSize = (10).Kilobytes();

fileSize.Bits      => 81920
fileSize.Bytes     => 10240
fileSize.Kilobytes => 10
fileSize.Megabytes => 0.009765625
fileSize.Gigabytes => 9.53674316e-6
fileSize.Terabytes => 9.31322575e-9

有几种扩展方法可让您将数字转换为ByteSize实例:

3.Bits();
5.Bytes();
(10.5).Kilobytes();
(2.5).Megabytes();
(10.2).Gigabytes();
(4.7).Terabytes();

您还可以使用+/-运算符和加/减方法对值进行加/减:

var total = (10).Gigabytes() + (512).Megabytes() - (2.5).Gigabytes();
total.Subtract((2500).Kilobytes()).Add((25).Megabytes());

ByteSize对象包含两个属性,它们代表最大的度量标准前缀符号和值:

var maxFileSize = (10).Kilobytes();

maxFileSize.LargestWholeNumberSymbol;  // "KB"
maxFileSize.LargestWholeNumberValue;   // 10

如果要使用字符串表示形式,则可以在ByteSize实例上互换调用ToString或Humanize:

7.Bits().ToString();           // 7 b
8.Bits().ToString();           // 1 B
(.5).Kilobytes().Humanize();   // 512 B
(1000).Kilobytes().ToString(); // 1000 KB
(1024).Kilobytes().Humanize(); // 1 MB
(.5).Gigabytes().Humanize();   // 512 MB
(1024).Gigabytes().ToString(); // 1 TB

您还可以选择提供期望的字符串表示形式的格式。 格式化程序可以包含要显示的值的符号:b,B,KB,MB,GB,TB。 格式化程序使用内置的double.ToString方法,将#。##作为默认格式,该格式将数字四舍五入到小数点后两位:

var b = (10.505).Kilobytes();

// Default number format is #.##
b.ToString("KB");         // 10.52 KB
b.Humanize("MB");         // .01 MB
b.Humanize("b");          // 86057 b

// Default symbol is the largest metric prefix value >= 1
b.ToString("#.#");        // 10.5 KB

// All valid values of double.ToString(string format) are acceptable
b.ToString("0.0000");     // 10.5050 KB
b.Humanize("000.00");     // 010.51 KB

// You can include number format and symbols
b.ToString("#.#### MB");  // .0103 MB
b.Humanize("0.00 GB");    // 0 GB
b.Humanize("#.## B");     // 10757.12 B

如果要使用完整单词的字符串表示形式,可以在ByteSize实例上调用ToFullWords:

7.Bits().ToFullWords();           // 7 bits
8.Bits().ToFullWords();           // 1 byte
(.5).Kilobytes().ToFullWords();   // 512 bytes
(1000).Kilobytes().ToFullWords(); // 1000 kilobytes
(1024).Kilobytes().ToFullWords(); // 1 megabyte
(.5).Gigabytes().ToFullWords();   // 512 megabytes
(1024).Gigabytes().ToFullWords(); // 1 terabyte

没有Dehumanize方法可以将字符串表示形式转换回ByteSize实例。 但是您可以对ByteSize使用Parse和TryParse来做到这一点。 像其他TryParse方法一样,ByteSize.TryParse返回布尔值,该值指示解析是否成功。 如果解析了该值,则将其输出到提供的out参数:

 

ByteSize output;
ByteSize.TryParse("1.5mb", out output);

// Invalid
ByteSize.Parse("1.5 b");   // Can't have partial bits

// Valid
ByteSize.Parse("5b");
ByteSize.Parse("1.55B");
ByteSize.Parse("1.55KB");
ByteSize.Parse("1.55 kB "); // Spaces are trimmed
ByteSize.Parse("1.55 kb");
ByteSize.Parse("1.55 MB");
ByteSize.Parse("1.55 mB");
ByteSize.Parse("1.55 mb");
ByteSize.Parse("1.55 GB");
ByteSize.Parse("1.55 gB");
ByteSize.Parse("1.55 gb");
ByteSize.Parse("1.55 TB");
ByteSize.Parse("1.55 tB");
ByteSize.Parse("1.55 tb");

最后,如果您需要计算传输一定数量字节的速率,则可以使用ByteSize的Per方法。 Per方法接受一个参数-字节的测量间隔; 这是传输字节所花费的时间。

Per方法返回具有Humanize方法的ByteRate类。 默认情况下,速率以秒为单位(例如MB / s)。 但是,如果需要,可以在另一个间隔内将TimeUnit传递给Humanize。 有效间隔是TimeUnit.Second,TimeUnit.Minute和TimeUnit.Hour。 下面是每个间隔的示例以及字节率的示例。

var size = ByteSize.FromMegabytes(10);
var measurementInterval = TimeSpan.FromSeconds(1);

var text = size.Per(measurementInterval).Humanize();
// 10 MB/s

text = size.Per(measurementInterval).Humanize(TimeUnit.Minute);
// 600 MB/min

text = size.Per(measurementInterval).Humanize(TimeUnit.Hour);
// 35.15625 GB/hour

您可以为人性化输出的字节部分指定格式:

 
19854651984.Bytes().Per(1.Seconds()).Humanize("#.##");
// 18.49 GB/s

 

21、角度到单词

Humanizer包括将数字标题更改为单词的方法。 标题可以是双精度,而结果将是字符串。 您可以选择返回标题的完整表示形式(例如,北,东,南或西),简短表示形式(例如,N,E,S,W)还是Unicode箭头字符(例如,↑,→,↓,←) )。

360.ToHeading();
// north
720.ToHeading();
// north

为了检索标题的简短版本,您可以使用以下调用:

180.ToHeading(true);
// S
360.ToHeading(true);
// N

请注意,文字表示的最大偏差为11.25°。

最重要的是,这些方法都有一个重载,您可以使用它提供一个CultureInfo对象,以确定要返回的本地化结果。

要检索表示标题的箭头,请使用以下方法:

90.ToHeadingArrow();
//
225.ToHeadingArrow();
//

标题的箭头表示最大偏差为22.5°。

为了检索基于短文本表示形式的标题(例如N,E,S,W),可以使用以下方法:

"S".FromShortHeading();
// 180
"SW".FromShortHeading();
// 225

 

22、元组化

Humanizer 可以使用Tupleize将整数更改为其“元组”。 例如:

1.Tupleize();
// single
3.Tupleize();
// triple
100.Tupleize();
// centuple

数字1-10、100和1000将转换为“命名”元组(即“单”,“双”等)。 任何其他数字“ n”将转换为“ n元组”。

 

Humanizer 混合到您的框架中以简化您的生活

这只是一个基础,您可以使用它来简化您的日常工作。 例如,在Asp.Net MVC中,我们一直在ViewModel属性上保留Display属性,以便HtmlHelper可以为我们生成正确的标签。 但是,就像枚举一样,在大多数情况下,我们只需要在属性名称中的单词之间留一个空格-那么为什么不使用“ string” .Humanize呢?

您可能会在执行该操作的代码中找到一个Asp.Net MVC示例(尽管该项目已从解决方案文件中排除,从而使nuget包也可用于.Net 3.5)。

这是通过使用名为HumanizerMetadataProvider的自定义DataAnnotationsModelMetadataProvider实现的。 它足够小,可以在这里重复; 所以我们开始:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web.Mvc;
using Humanizer;

namespace YourApp
{
    public class HumanizerMetadataProvider : DataAnnotationsModelMetadataProvider
    {
        protected override ModelMetadata CreateMetadata(
            IEnumerable<Attribute> attributes,
            Type containerType,
            Func<object> modelAccessor,
            Type modelType,
            string propertyName)
        {
            var propertyAttributes = attributes.ToList();
            var modelMetadata = base.CreateMetadata(propertyAttributes, containerType, modelAccessor, modelType, propertyName);

            if (IsTransformRequired(modelMetadata, propertyAttributes))
                modelMetadata.DisplayName = modelMetadata.PropertyName.Humanize();

            return modelMetadata;
        }

        private static bool IsTransformRequired(ModelMetadata modelMetadata, IList<Attribute> propertyAttributes)
        {
            if (string.IsNullOrEmpty(modelMetadata.PropertyName))
                return false;

            if (propertyAttributes.OfType<DisplayNameAttribute>().Any())
                return false;

            if (propertyAttributes.OfType<DisplayAttribute>().Any())
                return false;

            return true;
        }
    }
}

此类调用基类以提取元数据,然后根据需要使属性名称人性化。 它正在检查属性是否已经具有DisplayName或Display属性,在这种情况下,元数据提供程序将仅接受该属性,而保留该属性。 对于其他属性,它将人性化属性名称。 就这些。

现在,您需要使用Asp.Net MVC注册该元数据提供程序。 确保使用System.Web.Mvc.ModelMetadataProviders,而不使用System.Web.ModelBinding.ModelMetadataProviders:

ModelMetadataProviders.Current = new HumanizerMetadataProvider();

...现在您可以替换:

public class RegisterModel
{
    [Display(Name = "User name")]
    public string UserName { get; set; }

    [Display(Name = "Email address")]
    public string EmailAddress { get; set; }

    [Display(Name = "Confirm password")]
    public string ConfirmPassword { get; set; }
}

public class RegisterModel
{
    public string UserName { get; set; }
    public string EmailAddress { get; set; }
    public string ConfirmPassword { get; set; }
}

 

...,“元数据人性化工具”将负责其余的工作。

无需提及,如果您想为标签加上标题框,则可以使用Transform链接方法:

modelMetadata.DisplayName = modelMetadata.PropertyName.Humanize().Transform(To.TitleCase);

 

已知的安装问题和解决方法

由于CLI工具中的错误,主要的Humanizer软件包及其语言软件包将无法安装。 作为临时解决方法,在修复该错误之前,请改用Humanizer.xproj。 它包含所有语言。

 

 

GitHub地址:https://github.com/Humanizr/Humanizer



相关教程
关于我们--广告服务--免责声明--本站帮助-友情链接--版权声明--联系我们       黑ICP备07002182号