首页 > 其他分享 >[.NET] 单位转换实践:深入解析 Units.NET

[.NET] 单位转换实践:深入解析 Units.NET

时间:2025-01-05 17:33:53浏览次数:1  
标签:string 单位 var Units NET 解析 Temperature

单位转换实践:深入解析 Units.NET

摘要

在现代软件开发中,准确处理不同单位的转换是一个常见而复杂的需求。无论是处理温度、长度、重量还是其他物理量,都需要可靠的单位转换机制。本文将深入介绍 Units.NET 库,展示如何在 .NET 应用中优雅地处理单位转换。

基础配置

首先,通过 NuGet 安装 Units.NET:

<PackageReference Include="UnitsNet" Version="5.x.x" />

实战示例:天气 API

基础模型定义

public record WeatherForecast(
    Temperature Temperature,
    DateTime Date,
    string Summary
);

public record WeatherResponse(
    string DisplayValue,
    DateTime Date,
    string Summary
);

API 端点实现

var summaries = new[]
{
    "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
};

app.MapGet("/weather", (string? unit) =>
{
    var forecasts = Enumerable.Range(1, 5).Select(index =>
    {
        // 创建基础温度(摄氏度)
        var tempC = Temperature.FromDegreesCelsius(Random.Shared.Next(-20, 55));
        // 根据请求的单位进行转换
        var temp = unit?.ToLowerInvariant() switch
        {
            "f" or "fahrenheit" => tempC.ToUnit(TemperatureUnit.DegreeFahrenheit),
            "k" or "kelvin" => tempC.ToUnit(TemperatureUnit.Kelvin),
            _ => tempC
        };

        return new WeatherForecast(
            Temperature: temp,
            Date: DateTime.Now.AddDays(index),
            Summary: summaries[Random.Shared.Next(summaries.Length)]
        );
    })
    .ToArray();

    return forecasts.Select(f => new WeatherResponse(
        Date: f.Date,
        Summary: f.Summary,
        DisplayValue: f.Temperature.ToString("F2") //控制输出的数字为两位小数
    ));
})
.WithName("GetWeatherForecast");

当请求的units单位不同时,将输出相同温度的不同单位表示:

image
image
image

单位相互转换

public static class UnitConverter
{
    public static Temperature ConvertTemperature(
        double value, 
        string fromUnit, 
        string toUnit)
    {
        var temperature = fromUnit.ToLowerInvariant() switch
        {
            "c" => Temperature.FromDegreesCelsius(value),
            "f" => Temperature.FromDegreesFahrenheit(value),
            "k" => Temperature.FromKelvins(value),
            _ => throw new ArgumentException($"Unsupported unit: {fromUnit}")
        };

        return toUnit.ToLowerInvariant() switch
        {
            "c" => temperature.ToUnit(TemperatureUnit.DegreeCelsius),
            "f" => temperature.ToUnit(TemperatureUnit.DegreeFahrenheit),
            "k" => temperature.ToUnit(TemperatureUnit.Kelvin),
            _ => throw new ArgumentException($"Unsupported unit: {toUnit}")
        };
    }
}

数学运算支持

Units.NET 支持各种数学运算,使得单位计算变得简单:

public class UnitCalculations
{
        public static Speed CalculateSpeed(Length distance, Duration time)
        {
            return distance / time;
        }

        public static Acceleration CalculateAcceleration(Speed initialSpeed, Speed finalSpeed, Duration time)
        {
            return (finalSpeed - initialSpeed) / time;
        }

        public static Energy CalculateKineticEnergy(Mass mass, Speed velocity)
        {
            double massValue = mass.Kilograms;
            double velocityValue = velocity.MetersPerSecond;
            double energyValue = 0.5 * massValue * velocityValue * velocityValue;
            return Energy.FromJoules(energyValue);
        }
}

// 使用示例
var distance = Length.FromKilometers(100);
var time = Duration.FromHours(2);
var speed = UnitCalculations.CalculateSpeed(distance, time);
Console.WriteLine($"Speed: {speed.ToUnit(SpeedUnit.KilometerPerHour)}");

代码执行后,控制台将输出:Speed: 50 km/h

文化本地化支持

var usEnglish = new CultureInfo("en-US");
var russian = new CultureInfo("ru-RU");
var oneKg = Mass.FromKilograms(1);
// ToString() 使用 CurrentCulture 进行缩写语言和数字格式化。这与 .NET Framework 的行为一致,
// 因为 DateTime.ToString() 使用 CurrentCulture 处理整个字符串,可能是因为将英文日期格式与俄文月份名称混合在一起可能会令人困惑。
CultureInfo.CurrentCulture = russian;
string kgRu = oneKg.ToString(); // "1 кг"

// 使用特定文化和自定义字符串格式模式的 ToString()
string mgUs = oneKg.ToUnit(MassUnit.Milligram).ToString(usEnglish); // "unit: mg, value: 1.00"
string mgRu = oneKg.ToUnit(MassUnit.Milligram).ToString(russian); // "unit: мг, value: 1,00"

Console.WriteLine(mgUs);
Console.WriteLine(mgRu);
// 从字符串解析测量值
Mass kg = Mass.Parse("1.0 kg", usEnglish);

// 从字符串解析单位,一个单位可以有多个缩写
RotationalSpeedUnit rpm1 = RotationalSpeed.ParseUnit("rpm"); // RotationalSpeedUnit.RevolutionPerMinute
RotationalSpeedUnit rpm2 = RotationalSpeed.ParseUnit("r/min");  // RotationalSpeedUnit.RevolutionPerMinute

// 获取单位的默认缩写,如果在 Length.json 中为 Kilogram 单位定义了多个缩写,则获取第一个
string kgAbbreviation = Mass.GetAbbreviation(MassUnit.Kilogram); // "kg"

控制台将输出不同文化设置下的标准单位

1000000 mg
1000000 мг

结论

Units.NET 是一个强大而灵活的单位转换库,它不仅简化了单位转换的实现,还提供了丰富的功能支持。通过使用 Units.NET,开发者可以专注于业务逻辑,而不必担心单位转换的复杂性。无论是构建天气 API、物流系统还是科学计算应用,Units.NET 都是处理单位转换的理想选择。

标签:string,单位,var,Units,NET,解析,Temperature
From: https://www.cnblogs.com/madtom/p/18653522

相关文章

  • [ Netty ] 通过Netty聊天业务来加深理解Netty运行以及网络编程.
    引言这几天在学习Netty网络编程的过程当中对Netty的运作原理及流程有一定的了解,通过Netty实现聊天业务来加深对Netty的理解.这里用一张图概括运行流程这里我在Github上面找到一位大神总结的尚硅谷的学习笔记,里面有写Netty的运作原理(但是因为前面一直在讲原理我自己身原因容......
  • 软件缺少netevent.dll文件及错误提示问题
    在大部分情况下出现我们运行或安装软件,游戏出现提示丢失某些DLL文件或OCX文件的原因可能是原始安装包文件不完整造成,原因可能是某些系统防护软件将重要的DLL文件识别为可疑,阻止并放入了隔离单里,还有一些常见的DLL文件缺少是因为系统没有安装齐全的微软运行库,还有部分情况是因为......
  • 软件缺少neth.dll文件及错误提示问题
    在大部分情况下出现我们运行或安装软件,游戏出现提示丢失某些DLL文件或OCX文件的原因可能是原始安装包文件不完整造成,原因可能是某些系统防护软件将重要的DLL文件识别为可疑,阻止并放入了隔离单里,还有一些常见的DLL文件缺少是因为系统没有安装齐全的微软运行库,还有部分情况是因为......
  • 软件缺少netlogon.dll文件及错误提示问题
    在大部分情况下出现我们运行或安装软件,游戏出现提示丢失某些DLL文件或OCX文件的原因可能是原始安装包文件不完整造成,原因可能是某些系统防护软件将重要的DLL文件识别为可疑,阻止并放入了隔离单里,还有一些常见的DLL文件缺少是因为系统没有安装齐全的微软运行库,还有部分情况是因为......
  • 软件缺少NetSetupEngine.dll文件及错误提示问题
    在大部分情况下出现我们运行或安装软件,游戏出现提示丢失某些DLL文件或OCX文件的原因可能是原始安装包文件不完整造成,原因可能是某些系统防护软件将重要的DLL文件识别为可疑,阻止并放入了隔离单里,还有一些常见的DLL文件缺少是因为系统没有安装齐全的微软运行库,还有部分情况是因为......
  • 深入解析DNS、VPC、共享带宽包、负载均衡和IP的异同与配合使用
    个人名片......
  • 【AI学习笔记5】用C语言实现一个最简单的MLP网络 A simple MLP Neural network in C
    用C语言实现一个最简单的MLP网络AsimpleMLPNeural NetworkinClanguage 从图像中识别英文字母【1】从图像中识别多个不同的数字,属于多分类问题;每个图像是5*5的像素矩阵,分别包含1-5五个字母数字; 网络结构:一个隐藏层的MLP网络;       每个图像是5x5个......
  • .Net NativeAOT另外一种选择-bflat
    https://www.qiufengblog.com/articles/dotnet-native-bflat.html 前言说起bflat,还得先说NativeAOT,在.Net7时,正式把NativeAOT合到Runtime中,地位是明显上升了,对NativeAOT的代码提交也越来越多了,之前还是corert时,几年也没有太大的进展.这个时候的成果还是有ILC(ILCompi......
  • 用.NET X64 Native AOT编写的操作系统
    https://blog.csdn.net/sd7o95o/article/details/133191160 1.前言很多人想学习下.Net前沿技术和核心技术,这里推荐一个适合大家学习的案例,用.NETX64NativeAOT编写一个操作系统。2.概述MOOS(ToMakeMyOwn OperatingSystemProject)是一个采用.NETx64NativeAOT技术编写......
  • 如何看.net framework和.net core?
    了解.NETFramework和.NETCore的区别对于选择合适的技术栈和开发环境至关重要。以下是这两者的详细比较,包括它们的特点、适用场景、性能差异以及如何选择合适的框架。.NETFramework.NETFramework是Microsoft开发的第一个.NET平台,主要用于Windows操作系统上的应用......