') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); GitHub - GuOrg/Gu.Units: Units of measure for C# · GitHub
Skip to content

Latest commit

History

715 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Gu.Units.

LicenseGitterNuGetBuild statusBuild Status

Contents.

1. Quantity types.

  • Acceleration
  • AmountOfSubstance
  • Angle
  • AnglePerUnitless
  • AngularAcceleration
  • AngularJerk
  • AngularSpeed
  • Area
  • AreaDensity
  • Capacitance
  • CatalyticActivity
  • Current
  • Data
  • Density
  • ElectricalConductance
  • ElectricCharge
  • Energy
  • Flexibility
  • Force
  • ForcePerUnitless
  • Frequency
  • Illuminance
  • Inductance
  • Jerk
  • KinematicViscosity
  • Length
  • LengthPerUnitless
  • LuminousFlux
  • LuminousIntensity
  • MagneticFieldStrength
  • MagneticFlux
  • Mass
  • MassFlow
  • Momentum
  • Power
  • Pressure
  • Resistance
  • SolidAngle
  • SpecificEnergy
  • SpecificVolume
  • Speed
  • Stiffness
  • Temperature
  • Time
  • Torque
  • Unitless
  • Voltage
  • Volume
  • VolumetricFlow
  • Wavenumber

2. Features

2.1. Arithmetic.

privatestaticLengthUnitm=LengthUnit.m;privatestaticTimeUnits=TimeUnit.s;[Test]publicvoidArithmeticSample(){Lengthlength=1*m;Timetime=2*s;Speedspeed=length/time;Assert.AreEqual(0.5,speed.MetresPerSecond);}

2.2. Conversion.

[Test]publicvoidSample(){varl=Length.FromCentimetres(1.2);Assert.AreEqual(0.012,l.Metres);}

2.3. Formatting.

A large number of overloads for ToString()

[Test]publicvoidFormatSpeed(){varspeed=Speed.FromMetresPerSecond(1.2);using(Thread.CurrentThread.UsingTempCulture(CultureInfo.InvariantCulture)){Assert.AreEqual("1.2\u00A0m/s",speed.ToString());Assert.AreEqual("1.20 m/s",speed.ToString("F2 m/s"));Assert.AreEqual(UnknownFormat,1.2.ToString(UnknownFormat));// for comparisonAssert.AreEqual(UnknownFormat,speed.ToString(UnknownFormat));Assert.AreEqual("F1\u00A0{unit: invalid}",speed.ToString("F1 invalid"));Assert.AreEqual("1.20 m⋅s⁻¹",speed.ToString("F2 m⋅s⁻¹"));Assert.AreEqual("1.2\u00A0m⋅s⁻¹",speed.ToString("f1","m⋅s⁻¹"));Assert.AreEqual("1.2 m⋅s⁻¹",speed.ToString("f1 ","m⋅s⁻¹"));Assert.AreEqual("1.2 m⋅s⁻¹",speed.ToString("f1"," m⋅s⁻¹"));Assert.AreEqual("1.2 m⋅s⁻¹",speed.ToString("f1 "," m⋅s⁻¹"));Assert.AreEqual("{value: null} mm⋅s⁻¹",speed.ToString("mm⋅s⁻¹"));Assert.AreEqual("1200\u00A0s⁻¹⋅mm",speed.ToString("F0","s⁻¹⋅mm"));Assert.AreEqual("1200\u00A0s⁻¹⋅mm¹",speed.ToString("F0","s⁻¹⋅mm¹"));Assert.AreEqual("1.2\u00A0m*s^-1",speed.ToString("F1","m*s^-1"));Assert.AreEqual("1.2\u00A0s^-1*m",speed.ToString("F1","s^-1*m"));Assert.AreEqual("1.2\u00A0s^-1*m^1",speed.ToString("F1","s^-1*m^1"));Assert.AreEqual("4.32\u00A0km/h",speed.ToString(SpeedUnit.KilometresPerHour));Assert.AreEqual("1.2\u00A0m/s",speed.ToString(SpeedUnit.MetresPerSecond,SymbolFormat.Default));Assert.AreEqual("1.2\u00A0m/s",speed.ToString(SpeedUnit.MetresPerSecond,SymbolFormat.FractionHatPowers));Assert.AreEqual("1.2\u00A0m*s^-1",speed.ToString(SpeedUnit.MetresPerSecond,SymbolFormat.SignedHatPowers));Assert.AreEqual("1.2\u00A0m/s",speed.ToString(SpeedUnit.MetresPerSecond,SymbolFormat.FractionSuperScript));Assert.AreEqual("1.2\u00A0m⋅s⁻¹",speed.ToString(SpeedUnit.MetresPerSecond,SymbolFormat.SignedSuperScript));Assert.AreEqual("4.3\u00A0km/h",speed.ToString("F1",SpeedUnit.KilometresPerHour));Assert.AreEqual("1.2\u00A0m/s",speed.ToString("F1",SpeedUnit.MetresPerSecond,SymbolFormat.Default));Assert.AreEqual("1.2\u00A0m/s",speed.ToString("F1",SpeedUnit.MetresPerSecond,SymbolFormat.FractionHatPowers));Assert.AreEqual("1.2\u00A0m*s^-1",speed.ToString("F1",SpeedUnit.MetresPerSecond,SymbolFormat.SignedHatPowers));Assert.AreEqual("1.2\u00A0m/s",speed.ToString("F1",SpeedUnit.MetresPerSecond,SymbolFormat.FractionSuperScript));Assert.AreEqual("1.2\u00A0m⋅s⁻¹",speed.ToString("F1",SpeedUnit.MetresPerSecond,SymbolFormat.SignedSuperScript));Assert.AreEqual("1,200.00 mm⋅s⁻¹",speed.ToString("N mm⋅s⁻¹"));}varsv=CultureInfo.GetCultureInfo("sv-SE");Assert.AreEqual("1,2\u00A0m/s",speed.ToString(sv));Assert.AreEqual("1,20 m/s",speed.ToString("F2 m/s",sv));Assert.AreEqual(UnknownFormat,1.2.ToString(UnknownFormat,sv));// for comparisonAssert.AreEqual(UnknownFormat,speed.ToString(UnknownFormat,sv));Assert.AreEqual("F1\u00A0{unit: invalid}",speed.ToString("F1 invalid",sv));Assert.AreEqual("1,20 m⋅s⁻¹",speed.ToString("F2 m⋅s⁻¹",sv));Assert.AreEqual("1,2\u00A0m⋅s⁻¹",speed.ToString("f1","m⋅s⁻¹",sv));Assert.AreEqual("1,2 m⋅s⁻¹",speed.ToString("f1 ","m⋅s⁻¹",sv));Assert.AreEqual("1,2 m⋅s⁻¹",speed.ToString("f1"," m⋅s⁻¹",sv));Assert.AreEqual("1,2 m⋅s⁻¹",speed.ToString("f1 "," m⋅s⁻¹",sv));Assert.AreEqual("{value: null} mm⋅s⁻¹",speed.ToString("mm⋅s⁻¹",sv));Assert.AreEqual("1200\u00A0s⁻¹⋅mm",speed.ToString("F0","s⁻¹⋅mm",sv));Assert.AreEqual("1200\u00A0s⁻¹⋅mm¹",speed.ToString("F0","s⁻¹⋅mm¹",sv));Assert.AreEqual("1,2\u00A0m*s^-1",speed.ToString("F1","m*s^-1",sv));Assert.AreEqual("1,2\u00A0s^-1*m",speed.ToString("F1","s^-1*m",sv));Assert.AreEqual("1,2\u00A0s^-1*m^1",speed.ToString("F1","s^-1*m^1",sv));Assert.AreEqual("4,32\u00A0km/h",speed.ToString(SpeedUnit.KilometresPerHour,sv));Assert.AreEqual("1,2\u00A0m/s",speed.ToString(SpeedUnit.MetresPerSecond,SymbolFormat.Default,sv));Assert.AreEqual("1,2\u00A0m/s",speed.ToString(SpeedUnit.MetresPerSecond,SymbolFormat.FractionHatPowers,sv));Assert.AreEqual("1,2\u00A0m*s^-1",speed.ToString(SpeedUnit.MetresPerSecond,SymbolFormat.SignedHatPowers,sv));Assert.AreEqual("1,2\u00A0m/s",speed.ToString(SpeedUnit.MetresPerSecond,SymbolFormat.FractionSuperScript,sv));Assert.AreEqual("1,2\u00A0m⋅s⁻¹",speed.ToString(SpeedUnit.MetresPerSecond,SymbolFormat.SignedSuperScript,sv));Assert.AreEqual("4,3\u00A0km/h",speed.ToString("F1",SpeedUnit.KilometresPerHour,sv));Assert.AreEqual("1,2\u00A0m/s",speed.ToString("F1",SpeedUnit.MetresPerSecond,SymbolFormat.Default,sv));Assert.AreEqual("1,2\u00A0m/s",speed.ToString("F1",SpeedUnit.MetresPerSecond,SymbolFormat.FractionHatPowers,sv));Assert.AreEqual("1,2\u00A0m*s^-1",speed.ToString("F1",SpeedUnit.MetresPerSecond,SymbolFormat.SignedHatPowers,sv));Assert.AreEqual("1,2\u00A0m/s",speed.ToString("F1",SpeedUnit.MetresPerSecond,SymbolFormat.FractionSuperScript,sv));Assert.AreEqual("1,2\u00A0m⋅s⁻¹",speed.ToString("F1",SpeedUnit.MetresPerSecond,SymbolFormat.SignedSuperScript,sv));Assert.AreEqual("1\u00A0200,00 mm⋅s⁻¹",speed.ToString("N mm⋅s⁻¹",sv));}

2.4. Parsing.

[TestCase("1.2m/s")][TestCase("1.2m^1/s^1")][TestCase("1.2m^1*s^-1")][TestCase("1.2m^1*s^-1")][TestCase("1.2m⋅s⁻¹")][TestCase("1.2m¹/s¹")][TestCase("1.2m^1/s¹")]publicvoidParsingSample(stringtext){varspeed=Speed.Parse(text,CultureInfo.InvariantCulture);Assert.AreEqual(Speed.FromMetresPerSecond(1.2),Speed.Parse(text));Assert.IsTrue(Speed.TryParse(text,CultureInfo.InvariantCulture,outspeed));Assert.AreEqual(Speed.FromMetresPerSecond(1.2),Speed.Parse(text));}

3. Gu.Units.WPF.

NuGet

Valueconverters for binding to quantity types.

3.1. Simple sample.

<TextBoxText="{Binding Length, Converter={units:LengthConverter mm}}" />

Where the viewmodel has this property.

publicLengthLength{get{returnthis.length;}set{if(value.Equals(this.length)){return;}this.length=value;this.OnPropertyChanged();}}

3.2. ValueFormat.

Specifies how the scalar part is formatted, formats valid for double are valid.

<TextBoxText="{Binding Length, Converter={units:LengthConverter cm, ValueFormat='F2'}}" />

3.3. SymbolFormat.

Specifies how the symbol is formatted.

Text="{Binding Speed,
Converter={units:SpeedConverter mm/s, SymbolFormat=SignedSuperScript}}" />

3.4. UnitInput

Specifies how the symbol is formatted. The default value is ScalarOnly.

Text="{Binding Length,
Converter={units:LengthConverter m, UnitInput=SymbolRequired}}" />

4. Gu.Units.Json.

NuGet

Jsonconverters for serializtion using Json.NET.

5. Code generation when adding new quantities.

For adding new units and quantities read this

About

Units of measure for C#

Resources

Stars

25 stars

Watchers

5 watching

Forks

Releases

Packages

Used by

Contributors

Languages