{"id":13431194,"url":"https://github.com/angularsen/UnitsNet","last_synced_at":"2025-03-16T11:31:22.357Z","repository":{"id":37623090,"uuid":"11521218","full_name":"angularsen/UnitsNet","owner":"angularsen","description":"Makes life working with units of measurement just a little bit better.","archived":false,"fork":false,"pushed_at":"2024-10-23T17:05:59.000Z","size":67698,"stargazers_count":2604,"open_issues_count":24,"forks_count":384,"subscribers_count":36,"default_branch":"master","last_synced_at":"2024-11-09T08:08:17.899Z","etag":null,"topics":["abbreviations","conversion","converter","csharp","measure","measurement","measurements","measures","parse","powershell","quantities","quantity","unit","unit-converter","units","units-of-measure"],"latest_commit_sha":null,"homepage":"https://www.nuget.org/packages/UnitsNet/","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit-0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/angularsen.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2013-07-19T06:00:54.000Z","updated_at":"2024-11-09T07:45:21.000Z","dependencies_parsed_at":"2023-10-04T23:16:04.417Z","dependency_job_id":"9711b97f-b698-49d7-8587-01f36bd39ffa","html_url":"https://github.com/angularsen/UnitsNet","commit_stats":{"total_commits":2493,"total_committers":217,"mean_commits":"11.488479262672811","dds":0.6028880866425993,"last_synced_commit":"e08025456013d6a4826f1bd6c3276d7a43560836"},"previous_names":["anjdreas/unitsnet"],"tags_count":535,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/angularsen%2FUnitsNet","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/angularsen%2FUnitsNet/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/angularsen%2FUnitsNet/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/angularsen%2FUnitsNet/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/angularsen","download_url":"https://codeload.github.com/angularsen/UnitsNet/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243862796,"owners_count":20360212,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["abbreviations","conversion","converter","csharp","measure","measurement","measurements","measures","parse","powershell","quantities","quantity","unit","unit-converter","units","units-of-measure"],"created_at":"2024-07-31T02:01:01.240Z","updated_at":"2025-03-16T11:31:22.347Z","avatar_url":"https://github.com/angularsen.png","language":"C#","readme":"﻿[![Build Status](https://dev.azure.com/unitsnet/Units.NET/_apis/build/status/UnitsNet?branchName=master)](https://dev.azure.com/unitsnet/Units.NET/_build/latest?definitionId=1\u0026branchName=master)\n[![codecov](https://codecov.io/gh/angularsen/UnitsNet/branch/master/graph/badge.svg)](https://codecov.io/gh/angularsen/UnitsNet)\n[![StandWithUkraine](https://raw.githubusercontent.com/vshymanskyy/StandWithUkraine/main/badges/StandWithUkraine.svg)](https://github.com/vshymanskyy/StandWithUkraine/blob/main/docs/README.md)\n\n## Units.NET\n\nAdd strongly typed quantities to your code and get merrily on with your life.\n\nNo more magic constants found on Stack Overflow, no more second-guessing the unit of parameters and variables.\n\n[Upgrading from 4.x to 5.x](https://github.com/angularsen/UnitsNet/wiki/Upgrading-from-4.x-to-5.x)\u003cbr\u003e\n[Upgrading from 5.x to 6.x](https://github.com/angularsen/UnitsNet/wiki/Upgrading-from-5.x-to-6.x) (still in prerelease and may yet change)\n\n### Overview\n\n* [Overview](#overview)\n* [Installing via NuGet](#installing-via-nuget)\n* [Static Typing](#static-typing)\n* [Operator Overloads](#operator-overloads)\n* [Culture and Localization](#culture-and-localization)\n* [Dynamically Parse Quantities and Convert to Units](#dynamically-parse-quantities-and-convert-to-units)\n* [Custom units](#custom-units)\n* [Example: Unit converter app](#example-unit-converter-app)\n* [Example: WPF app using IValueConverter to parse input](#example-wpf-app-using-ivalueconverter-to-parse-input)\n* [Precision and Accuracy](#precision-and-accuracy)\n* [Serialize to JSON, XML and more](#serialize-to-json-xml-and-more)\n* [Want To Contribute?](#want-to-contribute)\n* [Continuous Integration](#continuous-integration)\n* [Who are Using This?](#who-are-using-this)\n* [Top Usages by GitHub Repos](#top-usages-by-gitHub-repos)\n* [Units.NET on other platforms](#unitsnet-on-other-platforms)\n\n### Installing via NuGet\n\nAdd it via CLI\n\n    dotnet add package UnitsNet\n\nor go to [NuGet Gallery | UnitsNet](https://www.nuget.org/packages/UnitsNet) for detailed instructions.\n\n\n#### Build Targets\n\n* .NET Standard 2.0\n* [.NET nanoFramework](https://www.nanoframework.net/)\n\n### Static Typing\n\n```C#\n// Construct\nLength meter = Length.FromMeters(1);\nLength twoMeters = new Length(2, LengthUnit.Meter);\n\n// Convert\ndouble cm = meter.Centimeters;         // 100\ndouble yards = meter.Yards;            // 1.09361\ndouble feet = meter.Feet;              // 3.28084\ndouble inches = meter.Inches;          // 39.3701\n\n// Pass quantity types instead of values to avoid conversion mistakes and communicate intent\nstring PrintPersonWeight(Mass weight)\n{\n    // Compile error! Newtons belong to Force, not Mass. A common source of confusion.\n    double weightNewtons = weight.Newtons;\n\n    // Convert to the unit of choice - when you need it\n    return $\"You weigh {weight.Kilograms:F1} kg.\";\n}\n```\n\n### Operator Overloads\n\n```C#\n// Arithmetic\nLength l1 = 2 * Length.FromMeters(1);\nLength l2 = Length.FromMeters(1) / 2;\nLength l3 = l1 + l2;\n\n// Construct between units\nLength distance = Speed.FromKilometersPerHour(80) * TimeSpan.FromMinutes(30);\nAcceleration a1 = Speed.FromKilometersPerHour(80) / TimeSpan.FromSeconds(2);\nAcceleration a2 = Force.FromNewtons(100) / Mass.FromKilograms(20);\nRotationalSpeed r = Angle.FromDegrees(90) / TimeSpan.FromSeconds(2);\n```\n\n### Culture and Localization\n\nThe culture for abbreviations defaults to Thread.CurrentCulture and falls back to US English if not defined. Thread.CurrentCulture affects number formatting unless a custom culture is specified. The relevant methods are:\n\n* ToString()\n* GetAbbreviation()\n* Parse/TryParse()\n* ParseUnit/TryParseUnit()\n```C#\nvar usEnglish = new CultureInfo(\"en-US\");\nvar russian = new CultureInfo(\"ru-RU\");\nvar oneKg = Mass.FromKilograms(1);\n\n// ToString() uses CurrentCulture for abbreviation language number formatting. This is consistent with the behavior of the .NET Framework,\n// where DateTime.ToString() uses CurrentCulture for the whole string, likely because mixing an english date format with a russian month name might be confusing.\nCultureInfo.CurrentCulture = russian;\nstring kgRu = oneKg.ToString(); // \"1 кг\"\n\n// ToString() with specific culture and custom string format pattern\nstring mgUs = oneKg.ToUnit(MassUnit.Milligram).ToString(usEnglish, \"unit: {1}, value: {0:F2}\"); // \"unit: mg, value: 1.00\"\nstring mgRu = oneKg.ToUnit(MassUnit.Milligram).ToString(russian, \"unit: {1}, value: {0:F2}\"); // \"unit: мг, value: 1,00\"\n\n// Parse measurement from string\nMass kg = Mass.Parse(\"1.0 kg\", usEnglish);\n\n// Parse unit from string, a unit can have multiple abbreviations\nRotationalSpeedUnit rpm1 = RotationalSpeed.ParseUnit(\"rpm\"); // RotationalSpeedUnit.RevolutionPerMinute\nRotationalSpeedUnit rpm2 = RotationalSpeed.ParseUnit(\"r/min\");  // RotationalSpeedUnit.RevolutionPerMinute\n\n// Get default abbreviation for a unit, the first if more than one is defined in Length.json for Kilogram unit\nstring kgAbbreviation = Mass.GetAbbreviation(MassUnit.Kilogram); // \"kg\"\n```\n\n#### Gotcha: AmbiguousUnitParseException\nSome units of a quantity have the same abbreviation, which means `.Parse()` is not able to know what unit you wanted.\nUnfortunately there is no built-in way to avoid this, either you need to ensure you don't pass in input that cannot be parsed or you need to write your own parser that has more knowledge of preferred units or maybe only a subset of the units.\n\nExample:\n`Length.Parse(\"1 pt\")` throws `AmbiguousUnitParseException` with message `Cannot parse \"pt\" since it could be either of these: DtpPoint, PrinterPoint`.\n\n### Dynamically Parse Quantities and Convert to Units\nSometimes you need to work with quantities and units at runtime, such as parsing user input.\n\nThere are a handful of classes to help with this:\n\n- [Quantity](UnitsNet/CustomCode/Quantity.cs) for parsing and constructing quantities as well as looking up units, names and quantity information dynamically\n- [UnitConverter](UnitsNet/UnitConverter.cs) for converting values to a different unit, with only strings or enum values\n- [UnitParser](UnitsNet/CustomCode/UnitParser.cs) for parsing unit abbreviation strings, such as `\"cm\"` to `LengthUnit.Centimeter`\n\n#### Quantity - Enumerate quantities and units at runtime\nUse `Quantity` class for looking up `QuantityInfo` and `UnitInfo` at runtime.\n\n```c#\nstring[] names = Quantity.Names;     // [\"Length\", \"Mass\", ...]\nQuantityInfo[] qis = Quantity.Infos; // All quantities and their units, types, values.\n\n// Look up quantity by name.\nQuantityInfo lengthInfo = Quantity.ByName[\"Length\"];\nUnitInfo[] lengthUnits = lengthInfo.UnitInfos;\n\n// Look up unit by enum value (note: for extensibility, will instead look up by name in the future)\nUnitInfo cmInfo = Quantity.GetUnitInfo(LengthUnit.Centimeter);\n```\n\n#### QuantityInfo - Information about a quantity\n`QuantityInfo` makes it easy to get names, units, types and values for a quantity.\nThis is useful for populating lists of quantities and units for the user to choose.\n\n```c#\n// Different ways to look up the quantity info.\nQuantityInfo lengthInfo = Quantity.ByName[\"Length\"];\nlengthInfo = Length.Info;\nlengthInfo = Length.FromMeters(1).QuantityInfo;\n\n// The quantity information.\nlengthInfo.Name;            // \"Length\"\nlengthInfo.UnitInfos;       // UnitInfo[] for its units Centimeter, Meter, etc.\nlengthInfo.BaseUnitInfo;    // UnitInfo for LengthUnit.Meter\nlengthInfo.BaseDimensions;  // {\"Length\": 1, \"Mass\": 0, ...}\nlengthInfo.UnitType;        // typeof(LengthUnit)\nlengthInfo.ValueType;       // typeof(Length)\nlengthInfo.Zero;            // Length.Zero\n```\n\n#### UnitInfo - Information about a unit\n`UnitInfo` describes a unit, such as its enum value, names and its representation in SI base units.\n\n```c#\n// Different ways to look up the unit info.\nvar cm = Quantity.GetUnitInfo(LengthUnit.Centimeter);\n\nif (Quantity.TryGetUnitInfo(LengthUnit.Centimeter, out UnitInfo tryGetCm)) {\n    cm = tryGetCm;\n}\n\n// The unit information.\ncm.Value;       // Enum value: LengthUnit.Centimeter\ncm.Name;        // \"Centimeter\"\ncm.PluralName;  // \"Centimeters\"\ncm.BaseUnits;   // {\"Length\": Centimeter, \"Mass\": null, \"Time\": null, ...}\n```\n\n#### Construct quantity\nAll you need is the value and the unit enum value.\n\n```c#\nIQuantity quantity = Quantity.From(3, LengthUnit.Centimeter); // Length\n\nif (Quantity.TryFrom(3, LengthUnit.Centimeter, out IQuantity quantity2))\n{\n}\n```\n\nYou can also construct from strings, such as mapping between DTO types in an API:\n```c#\nIQuantity quantity = Quantity.From(value: 3, quantityName: \"Length\", unitName: \"Centimeter\");\n\nif (Quantity.TryFrom(value: 3, quantityName: \"Length\", unitName: \"Centimeter\", out IQuantity? quantity2))\n{\n}\n```\n\nOr create by just the unit abbreviation, as long as there is exactly one unit with this abbreviation.\n```c#\n// Length with unit LengthUnit.Centimeter\nIQuantity quantity = Quantity.FromUnitAbbreviation(3, \"cm\");\n\nif (Quantity.TryFromUnitAbbreviation(3, \"cm\", out IQuantity? quantity2))\n{\n}\n```\n\n#### Parse quantity\nParse any string to a quantity instance of the given the quantity type.\n\n```c#\nIQuantity quantity = Quantity.Parse(typeof(Length), \"3 cm\"); // Length\n\nif (Quantity.TryParse(typeof(Length), \"3cm\", out IQuantity quantity2)\n{\n}\n```\n\n#### Parse unit\n[UnitParser](UnitsNet/CustomCode/UnitParser.cs) parses unit abbreviation strings to unit enum values.\n\n```c#\nEnum unit = UnitsNetSetup.Default.UnitParser.Parse(\"cm\", typeof(LengthUnit)); // LengthUnit.Centimeter\n\nif (UnitsNetSetup.Default.UnitParser.TryParse(\"cm\", typeof(LengthUnit), out Enum unit2))\n{\n    // Use unit2 as LengthUnit.Centimeter\n}\n```\n\n#### Convert quantity to unit - IQuantity and Enum\nConvert any `IQuantity` instance to a different unit by providing a target unit enum value.\n```c#\n// Assume these are passed in at runtime, we don't know their values or type\nEnum userSelectedUnit = LengthUnit.Millimeter;\nIQuantity quantity = Length.FromCentimeters(3);\n\n// Later we convert to a unit\nquantity.ToUnit(userSelectedUnit).Value;      // 30\nquantity.ToUnit(userSelectedUnit).Unit;       // LengthUnit.Millimeter\nquantity.ToUnit(userSelectedUnit).ToString(); // \"30 mm\"\nquantity.ToUnit(PressureUnit.Pascal);         // Throws exception, not compatible\nquantity.As(userSelectedUnit);                // 30\n```\n\n#### Convert quantity to unit - From/To Enums\nUseful when populating lists with unit enum values for the user to choose.\n\n```c#\nUnitConverter.Convert(1, LengthUnit.Centimeter, LengthUnit.Millimeter); // 10 mm\n```\n\n#### Convert quantity to unit - Names or abbreviation strings\nSometimes you only have strings to work with, that works too!\n\n```c#\nUnitConverter.ConvertByName(1, \"Length\", \"Centimeter\", \"Millimeter\"); // 10 mm\nUnitConverter.ConvertByAbbreviation(1, \"Length\", \"cm\", \"mm\"); // 10 mm\n```\n\n### Custom units\n\nUnits.NET allows you to add your own units and quantities at runtime, to represent as `IQuantity` and reusing Units.NET for parsing and converting between units.\n\nRead more at [Extending-with-Custom-Units](https://github.com/angularsen/UnitsNet/wiki/Extending-with-Custom-Units).\n\n#### Map between unit enum values and unit abbreviations\n```c#\n// Map unit enum values to unit abbreviations\nvar unitAbbreviations = UnitsNetSetup.Default.UnitAbbreviations;\nunitAbbreviations.MapUnitToDefaultAbbreviation(HowMuchUnit.Some, \"sm\");\nunitAbbreviations.GetDefaultAbbreviation(HowMuchUnit.Some); // \"sm\"\n\nUnitsNetSetup.Default.UnitParser.Parse\u003cHowMuchUnit\u003e(\"sm\");  // HowMuchUnit.Some\n```\n\n#### Convert between units of custom quantity\n```c#\nvar unitConverter = UnitsNetSetup.Default.UnitConverter;\nunitConverter.SetConversionFunction\u003cHowMuch\u003e(HowMuchUnit.Lots, HowMuchUnit.Some, x =\u003e new HowMuch(x.Value * 2, HowMuchUnit.Some));\nunitConverter.SetConversionFunction\u003cHowMuch\u003e(HowMuchUnit.Tons, HowMuchUnit.Lots, x =\u003e new HowMuch(x.Value * 10, HowMuchUnit.Lots));\nunitConverter.SetConversionFunction\u003cHowMuch\u003e(HowMuchUnit.Tons, HowMuchUnit.Some, x =\u003e new HowMuch(x.Value * 20, HowMuchUnit.Some));\n\nvar from = new HowMuch(10, HowMuchUnit.Tons);\nIQuantity Convert(HowMuchUnit toUnit) =\u003e unitConverter.GetConversionFunction\u003cHowMuch\u003e(from.Unit, toUnit)(from);\n\nConsole.WriteLine($\"Convert 10 tons to:\");\nConsole.WriteLine(Convert(HowMuchUnit.Some)); // 200 sm\nConsole.WriteLine(Convert(HowMuchUnit.Lots)); // 100 lts\nConsole.WriteLine(Convert(HowMuchUnit.Tons)); // 10 tns\n```\n\n#### Parse custom quantity\n[QuantityParser](UnitsNet/CustomCode/QuantityParser.cs) parses quantity strings to `IQuantity` by mapping custom units to unit abbreviations in `UnitAbbreviationsCache`.\n\n```c#\n// Map custom units to abbreviations\nvar unitAbbreviationsCache = UnitsNetSetup.Default.UnitAbbreviations;\nunitAbbreviationsCache.MapUnitToAbbreviation(HowMuchUnit.Some, \"sm\");\nunitAbbreviationsCache.MapUnitToAbbreviation(HowMuchUnit.ATon, \"tn\");\n\nvar quantityParser = UnitsNetSetup.Default.QuantityParser;\n\n// \"1 sm\" =\u003e new HowMuch(1, HowMuchUnit.Some)\nHowMuch q = quantityParser.Parse\u003cHowMuch, HowMuchUnit\u003e(\n    str: \"1 sm\",\n    formatProvider: null,\n    fromDelegate: (value, unit) =\u003e new HowMuch((double) value, unit));\n```\n\n```c#\n// Alternatively, create your own instances to not change the global singleton instances.\nvar unitAbbreviationsCache = UnitAbbreviationsCache.CreateDefault(); // or .CreateEmpty()\nunitAbbreviationsCache.MapUnitToAbbreviation(HowMuchUnit.Some, \"sm\");\nunitAbbreviationsCache.MapUnitToAbbreviation(HowMuchUnit.ATon, \"tn\");\n\nvar quantityParser = new QuantityParser(unitAbbreviationsCache);\n```\n\n\n### Example: Unit converter app\n[Source code](https://github.com/angularsen/UnitsNet/tree/master/Samples/UnitConverter.Wpf) for `Samples/UnitConverter.Wpf`\u003cbr/\u003e\n[Download](https://github.com/angularsen/UnitsNet/releases/tag/UnitConverterWpf%2F2018-11-09) (release 2018-11-09 for Windows)\n\n![image](https://user-images.githubusercontent.com/787816/34920961-9b697004-f97b-11e7-9e9a-51ff7142969b.png)\n\nThis example shows how you can create a dynamic unit converter, where the user selects the quantity to convert, such as `Temperature`, then selects to convert from `DegreeCelsius` to `DegreeFahrenheit` and types in a numeric value for how many degrees Celsius to convert.\nThe quantity list box contains quantity names, such as `\"Length\"`. The two unit list boxes contain `Enum` values, such as `LengthUnit.Meter`.\n\n#### Populate quantity selector\nUse `Quantity` to enumerate all quantity names, such as `\"Length\"` and `\"Mass\"`.\n\n```c#\nthis.Quantities = Quantity.Names; // string[]\n\n// or\nthis.Quantities = Quantity.Infos.Select(i =\u003e i.Name).ToList();\n```\n\n#### Update unit lists when selecting new quantity\nSo user can only choose from/to units compatible with the quantity type.\n\n```c#\nQuantityInfo quantityInfo = Quantity.ByName[quantityName];\n\n_units.Clear();\nforeach (Enum unitValue in quantityInfo.UnitInfos.Select(ui =\u003e ui.Value))\n{\n    _units.Add(new UnitListItem(unitValue));\n}\n```\n\n#### Update calculation on unit selection changed\nUsing `UnitConverter` to convert by unit enum values as given by the list selection `\"Length\"` and unit names like `\"Centimeter\"` and `\"Meter\"`.\n\n```c#\ndouble convertedValue = UnitConverter.Convert(\n    FromValue,                      // numeric value\n    SelectedFromUnit.UnitEnumValue, // Enum, such as LengthUnit.Meter\n    SelectedToUnit.UnitEnumValue);  // Enum, such as LengthUnit.Centimeter\n```\n\n### Example: WPF app using IValueConverter to parse input\n\nSrc: [Samples/MvvmSample.Wpf](https://github.com/angularsen/UnitsNet/tree/master/Samples/MvvmSample.Wpf)\n\n![wpfmvvmsample_219w](https://user-images.githubusercontent.com/787816/34913417-094332e2-f8fd-11e7-9d8a-92db105fbbc9.png)\n\nThe purpose of this app is to show how to create an `IValueConverter` in order to bind XAML to quantities.\n\n### Precision and Accuracy\n\nA base unit is chosen for each unit class, represented by a double value (64-bit), and all conversions go via this unit. This means that there will always be a small error in both representing other units than the base unit as well as converting between units.\n\nUnits.NET was intended for convenience and ease of use, not highly accurate conversions, but I am open to suggestions for improvements.\n\nThe tests accept an error up to 1E-5 for most units added so far. Exceptions include units like Teaspoon, where the base unit cubic meter is a lot bigger. In many usecases this is sufficient, but for others this may be a showstopper and something you need to be aware of.\n\nFor more details, see [Precision](https://github.com/angularsen/UnitsNet/wiki/Precision).\n\n### Serialize to JSON, XML and more\n\nRead the wiki on [Serializing to JSON, XML and more](https://github.com/angularsen/UnitsNet/wiki/Serializing-to-JSON,-XML-and-more).\n\n\n### Want To Contribute?\n\n- [Adding a New Unit](https://github.com/angularsen/UnitsNet/wiki/Adding-a-New-Unit) is fairly easy to do and we are happy to help.\n- Want a new feature or to report a bug? [Create an issue](https://github.com/angularsen/UnitsNet/issues/new/choose) or start a [discussion](https://github.com/angularsen/UnitsNet/discussions).\n\n### Continuous Integration\n\n[Azure DevOps](https://dev.azure.com/unitsnet/Units.NET/) performs the following:\n* Build and test all branches\n* Build and test pull requests, notifies on success or error\n* Deploy nugets on master branch, if nuspec versions changed\n\n\n### Who are Using UnitsNet?\n\nIt would be awesome to know who are using this library. If you would like your project listed here, [create an issue](https://github.com/angularsen/UnitsNet/issues) or edit the [README.md](https://github.com/angularsen/UnitsNet/edit/master/README.md) and send a pull request. Max logo size is `300x35 pixels` and should be in `.png`, `.gif` or `.jpg` formats.\n\n![Motion Catalyst logo](http://swingcatalyst.s3.amazonaws.com/images/logos/MotionCatalyst_greenblack_35p.png \"Motion Catalyst logo\")\n\n#### Swing Catalyst and Motion Catalyst, Norway\n\u003e Sports performance applications for Windows and iOS, that combine high-speed video with sensor data to bring facts into your training and visualize the invisible forces at work\n\u003e\n\u003e Units.NET started here in 2007 when reading strain gauge measurements from force plates and has been very useful in integrating a number of different sensor types into our software and presenting the data in the user's preferred culture and units.\n\nhttps://www.swingcatalyst.com (for golf)\u003cbr\u003e\nhttps://www.motioncatalyst.com (everything else)\n\n*- Andreas Gullberg Larsen, CTO (andreas@motioncatalyst.com)*\n\n![PK Sound logo](https://cloud.githubusercontent.com/assets/17773454/19447800/5c6ec76c-945c-11e6-90f8-3f410e8157b9.jpg)\n#### PK Sound, Canada\n\u003e Award-winning performers and composers put everything they’ve got into their music. PK Sound makes sure their fans will hear it all – brilliantly, precisely, consistently.\n\u003e\n\u003e PK Sound uses UnitsNet in Kontrol - the remote control counterpart to Trinity, the world's only robotic line array solution.\n\nhttp://www.pksound.ca/pk-sound/announcing-the-official-release-of-kontrol/ (for an idea of what the Kontrol project is)\u003cbr\u003e\nhttp://www.pksound.ca/trinity/ (the speakers that Kontrol currently controls)\u003cbr\u003e\nhttp://www.pksound.ca/ (everything else)\n\n*- Jules LaPrairie, Kontrol software team member*\n\n#### Microsoft.IoT.Devices\n\u003e Microsoft.IoT.Devices extends Windows IoT Core and makes it easier to support devices like sensors and displays. It provides event-driven access for many digital and analog devices and even provides specialized wrappers for devices like joystick, rotary encoder and graphics display.\n\nhttp://aka.ms/iotdevices (home page including docs)\u003cbr\u003e\nhttp://www.nuget.org/packages/Microsoft.IoT.Devices (NuGet package)\n\n#### Crawlspace\n\u003e Software for creating printable hex maps for use in pen and paper RPGs. Both\n\u003e a user-friendly app and a high-level library for generating labelled hexmaps.\n\nhttps://bitbucket.org/MartinEden/Crawlspace\n\n*- Martin Eden, project maintainer*\n\n![ANSYS, Inc. Logo](https://www.ansys.com/-/media/ansys/global/brandings/logo-ansys.jpg \"ANSYS, Inc. Logo\")\n\n#### ANSYS, Inc. (ANSYS Discovery Live)\n\u003e ANSYS Discovery Live provides instantaneous 3D simulation, tightly coupled with direct geometry modeling, to enable interactive design exploration and rapid product innovation. It is an interactive experience in which you can manipulate geometry, material types or physics inputs, then instantaneously see changes in performance.\n\nhttps://www.ansys.com\nhttps://www.ansys.com/products/3d-design/ansys-discovery-live\n\n*- Tristan Milnthorp, Principal Software Architect (tristan.milnthorp@ansys.com)*\n\n#### Primoris Sigma Stargen\nStargen is a decades old software to create realistic planets and satellites from a given Star. It's based on work from various scientists and been used for years. Primoris Sigma Stargen is a C# port of the utility that makes it a Framework to extend it with new algorithms for planetary formation and physics equations.\n\nhttps://github.com/ebfortin/primoris.universe.stargen\n\n\u003cimg src=\"https://cdn.harringtonhoists.com/assets/harringtonhoists/logo-60629cc144429045d4c85740ab225e219add75b2c5c1e2c444ffa9500347a414.png\" height=\"35\"\u003e\n\n#### Harrington Hoists, Inc. (A Subsidiary of KITO Americas, Inc.)\n\u003e Harrington Hoists, Inc. is located in Manheim, PA, Elizabethtown, PA, South Holland, IL and Corona, CA. Harrington is a leading manufacturer of manual, electric and air chain hoists as well as wire rope hoists and crane products serving the North American material handling industry.\n\nHarrington uses UnitsNet in their internal software to perform many different calculations related to crane dimensioning, girder strength, electrical safety verification, etc.\n\nhttps://www.harringtonhoists.com\u003cbr\u003e\nhttps://kito.com\n\n*- Luke Westfall, Design Automation Engineer*\n\n#### Structural Analysis Format - SDK project\n\u003cimg src=\"https://gblobscdn.gitbook.com/spaces%2F-M__87HTlQktMqcjAf65%2Favatar-1620901174483.png?alt=media\" height=\"35\" /\u003e\n\n\u003e The Structural Analysis Format (SAF) has been created to allow structural engineering applications to exchange data using a straight forward and simple to understand format.\n\u003e While inspired by IFC, SAF has its benefits that it's **easily modifyable** by the end-user _(it's an xlsx file)_, **well documented** and **easy to understand**.\n\u003e UnitsNet is used by the SDK provided by SCIA to facilitate import / export between metric \u0026 imperial systems\n\nhttps://www.saf.guide\nhttps://github.com/StructuralAnalysisFormat/StructuralAnalysisFormat-SDK\n\n*- Dirk Schuermans, Software Engineer for [SCIA nv](https://www.scia.net)*\n\n### Top Usages by GitHub Repos\n\nProduced with [ghtopdep](https://github.com/github-tooling/ghtopdep).\n\n| Repo                                                            | Stars   |\n|-----------------------------------------------------------------|---------|\n| https://github.com/microsoft/PowerToys                          | 105K    |\n| https://github.com/dotnet/iot                                   | 2.1K    |\n| https://github.com/genielabs/HomeGenie                          | 388     |\n| https://github.com/raspberry-sharp/raspberry-sharp-io           | 340     |\n| https://github.com/nanoframework/nanoFramework.IoT.Device       | 202     |\n| https://github.com/porrey/Virtual-ZPL-Printer                   | 166     |\n| https://github.com/chino-os/chino-os                            | 147     |\n| https://github.com/BriefFiniteElementNet/BriefFiniteElement.Net | 143     |\n| https://github.com/WhiteBlackGoose/UnitsOfMeasure               | 57      |\n| https://github.com/pi-top/pi-top-4-.NET-SDK                     | 48      |\n\n\n### Units.NET on other platforms\n\nGet the same strongly typed units on other platforms, based on the same [unit definitions](/Common/UnitDefinitions).\n\n| Language                   | Name        | Package                                                             | Repository                                           | Maintainers  |\n|----------------------------|-------------|---------------------------------------------------------------------|------------------------------------------------------|--------------|\n| JavaScript /\u003cbr\u003eTypeScript | unitsnet-js | [npm](https://www.npmjs.com/package/unitsnet-js)                    | [github](https://github.com/haimkastner/unitsnet-js) | @haimkastner |\n| Python                     | unitsnet-py | [pypi](https://pypi.org/project/unitsnet-py)                        | [github](https://github.com/haimkastner/unitsnet-py) | @haimkastner |\n| Golang                     | unitsnet-go | [pkg.go.dev](https://pkg.go.dev/github.com/haimkastner/unitsnet-go) | [github](https://github.com/haimkastner/unitsnet-go) | @haimkastner |","funding_links":[],"categories":["Frameworks, Libraries and Tools","csharp","框架, 库和工具","C\\#","Others","Tools","Identifiers","Misc","C# #"],"sub_categories":["Misc","大杂烩","Mathematics","GUI - other"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fangularsen%2FUnitsNet","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fangularsen%2FUnitsNet","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fangularsen%2FUnitsNet/lists"}