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

news/2025/1/7 11:47:18/文章来源:https://www.cnblogs.com/madtom/p/18653522

单位转换实践:深入解析 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 都是处理单位转换的理想选择。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/864472.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

卡诺图化简

卡诺图化简 卡诺图(Karnaugh Map,简称K图)是一种用于简化布尔代数表达式的工具。它通过将真值表的值图形化,帮助我们更直观地找到最小项和最大项,从而简化逻辑表达式。 卡诺图的基本概念单元格:每个单元格代表一个布尔变量的可能取值组合。 邻接:两个单元格如果只有一个…

Postman与ElasticSearch交互

为了方便测试,修改ES安装路径下的config/elasticsearch.yml中的安全配置,不使用密钥访问。 以下配置的enabled都改为false # Enable security features xpack.security.enabled: falsexpack.security.enrollment.enabled: false# Enable encryption for HTTP API client conn…

本地搭建ElasticSearch

1:在elastic.co下载安装包 https://www.elastic.co/downloads/elasticsearch windows版本的是个zip包,下载解压缩后可直接通过命令行运行 cd [安装路径]/bin elasticsearch2:配置 默认需要ssl、密码等安全配置,会导致localhost:9200访问失败。可通过以下方式关闭安全配置,…

20241307《计算机基础与程序设计》课程总结

目录 第一节 第二节 教材学习内容总结 C语言程序设计第十三章和第十四章的总结: 第十三章:文件操作文件的打开与关闭 • 使用fopen()函数打开文件,它接受文件名和模式作为参数,返回一个FILE指针。 • fclose()函数用于关闭文件,释放资源。 文件的读取 • fgetc()和getc…

错误记录:[Synth 8-6895] The reference checkpoint

报错详情点击查看代码 [Synth 8-6895] The reference checkpoint E:/Projects/Vivado2023/2.ExampleDesign_my/iic_ms/iic_ms.srcs/utils_1/imports/synth_1/Master.dcp is not suitable for use with incremental synthesis for this design. Please regenerate the checkpoin…

4 跨音速

可以的话请点个赞吧,欧内盖,如果没有大伙支持的话,瓦达西!4 跨音速 基本 升力的基本计算公式为:\(L=\frac{1}{2}\rho_{\infty}V_{\infty}^{2}Sc_{l}\) 对于二维翼型升力系数\(c_l\)而言,它直接和机翼截面几何结构相关,即随翼型弯度增大、厚度-弦长比增大而增大。 ‍ ​​…

CPU负载均衡之WALT

前言 本文继续整理CPU调度WALT相关内容,主要整理如下内容:WALT是什么? WALT 计算? WALT 计算数据如何使用?1. WALT是什么? WALT:Windows-Assist Load Tracing的缩写:从字面意思来看,是以window作为辅助项来跟踪CPU LOAD; 实质上是一种计算方法,用数据来表现CPU当前的…

[ Netty ] 通过Netty聊天业务来加深理解Netty运行以及网络编程.

引言这几天在学习Netty网络编程的过程当中对Netty的运作原理及流程有一定的了解,通过Netty实现聊天业务来加深对Netty的理解.这里用一张图概括运行流程这里我在Github上面找到一位大神总结的尚硅谷的学习笔记,里面有写Netty的运作原理(但是因为前面一直在讲原理我自己身原因容易…

输出下列图形

题目很简单但也算是复习知识点,有三种做法,第一种是直接printf,第二种是循环语句,第三种是调用函数。printf省略 for循环: ① ②调用函数:

动手深度学习-PyTorch(第二版)PDF、EPUB免费下载

李沐,动手深度学习,中文第二版,2023年8月18日。本书是《动手学深度学习》的重磅升级版本,选用经典的PyTorch深度学习框架,旨在向读者交付更为便捷的有关深度学习的交互式学习体验。 本书重新修订《动手学深度学习》的所有内容,并针对技术的发展,新增注意力机制、预训练等…

Python数据结构与算法分析 第3版PDF、EPUB免费下载

只有洞彻数据结构与算法,才能真正精通Python!热门计算机科学教材,华盛顿大学、北京大学等多家高校采用,让你在代码编写的战场上所向披靡!适读人群 :1. 希望学习数据结构和算法的Python用户; 2. 计算机专业的学生和老师。 只有洞彻数据结构与算法,才能真正精通Python!热…

《计算机组成及汇编语言原理》读后感

一、 为什么选择这本书? 这本书来自于:https://github.com/codefollower/My-Blog/issues/1。工作之后,个人一直追求的一个方面就是“系统化”,笼统的来说就是从以下两方面进行系统化:“基础”+“专业”。这本书属于基础方面的深化,通过 Java 虚拟机来讲计算机组成。 二、…