Skip to content

Commit fb1c4c7

Browse files
committed
Support decimal and long base unit types
1 parent b6d6894 commit fb1c4c7

File tree

1 file changed

+55
-24
lines changed

1 file changed

+55
-24
lines changed

Src/Scripts/GenerateUnits.ps1

Lines changed: 55 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -10,35 +10,42 @@
1010
{
1111
$prefixInfo = switch ($prefix)
1212
{
13-
"Kilo" { "k", "1e3"; break; }
14-
"Hecto" { "h", "1e2"; break; }
15-
"Deca" { "da", "1e1"; break; }
16-
"Deci" { "d", "1e-1"; break; }
17-
"Centi" { "c", "1e-2"; break; }
18-
"Milli" { "m", "1e-3"; break; }
19-
"Micro" { "μ", "1e-6"; break; }
20-
"Nano" { "n", "1e-9"; break; }
13+
"Kilo" { "k", "1e3d"; break; }
14+
"Hecto" { "h", "1e2d"; break; }
15+
"Deca" { "da", "1e1d"; break; }
16+
"Deci" { "d", "1e-1d"; break; }
17+
"Centi" { "c", "1e-2d"; break; }
18+
"Milli" { "m", "1e-3d"; break; }
19+
"Micro" { "μ", "1e-6d"; break; }
20+
"Nano" { "n", "1e-9d"; break; }
2121

2222
# Optimization, move less frequently used prefixes to the end
23-
"Pico" { "p", "1e-12"; break; }
24-
"Femto" { "f", "1e-15"; break; }
25-
"Atto" { "a", "1e-18"; break; }
26-
"Zepto" { "z", "1e-21"; break; }
27-
"Yocto" { "y", "1e-24"; break; }
28-
29-
"Yotta" { "Y", "1e24"; break; }
30-
"Zetta" { "Z", "1e21"; break; }
31-
"Exa" { "E", "1e18"; break; }
32-
"Peta" { "P", "1e15"; break; }
33-
"Tera" { "T", "1e12"; break; }
34-
"Giga" { "G", "1e9"; break; }
35-
"Mega" { "M", "1e6"; break; }
36-
37-
}
23+
"Pico" { "p", "1e-12d"; break; }
24+
"Femto" { "f", "1e-15d"; break; }
25+
"Atto" { "a", "1e-18d"; break; }
26+
"Zepto" { "z", "1e-21d"; break; }
27+
"Yocto" { "y", "1e-24d"; break; }
28+
29+
"Yotta" { "Y", "1e24d"; break; }
30+
"Zetta" { "Z", "1e21d"; break; }
31+
"Exa" { "E", "1e18d"; break; }
32+
"Peta" { "P", "1e15d"; break; }
33+
"Tera" { "T", "1e12d"; break; }
34+
"Giga" { "G", "1e9d"; break; }
35+
"Mega" { "M", "1e6d"; break; }
36+
37+
# Binary prefixes
38+
"Kibi" { "Ki", "1024d"; break; }
39+
"Mebi" { "Mi", "(1024d * 1024)"; break; }
40+
"Gibi" { "Gi", "(1024d * 1024 * 1024)"; break; }
41+
"Tebi" { "Ti", "(1024d * 1024 * 1024 * 1024)"; break; }
42+
"Pebi" { "Pi", "(1024d * 1024 * 1024 * 1024 * 1024)"; break; }
43+
"Exbi" { "Ei", "(1024d * 1024 * 1024 * 1024 * 1024 * 1024)"; break; }
44+
}
3845

3946
$prefixAbbreviation = $prefixInfo[0];
4047
$prefixFactor = $prefixInfo[1];
41-
48+
4249
$u = New-Object PsObject -Property @{
4350
SingularName=$prefix+$unit.SingularName.ToLowerInvariant();
4451
PluralName=$prefix+$unit.PluralName.ToLowerInvariant();
@@ -60,6 +67,25 @@
6067
}
6168
}
6269

70+
foreach ($u in $units) {
71+
# Use decimal for internal calculations if base type is not double, such as for long or int.
72+
if ($unitClass.BaseType -ne "double") {
73+
$u.FromUnitToBaseFunc = $u.FromUnitToBaseFunc -replace "m", "d";
74+
$u.FromBaseToUnitFunc = $u.FromBaseToUnitFunc -replace "d", "m";
75+
}
76+
77+
# Convert to/from double for other base types
78+
if ($unitClass.BaseType -eq "decimal") {
79+
$u.FromUnitToBaseFunc = "Convert.ToDecimal($($u.FromUnitToBaseFunc))";
80+
$u.FromBaseToUnitFunc = "Convert.ToDouble($($u.FromBaseToUnitFunc))";
81+
} else {
82+
if ($unitClass.BaseType -eq "long") {
83+
$u.FromUnitToBaseFunc = "Convert.ToInt64($($u.FromUnitToBaseFunc))";
84+
$u.FromBaseToUnitFunc = "Convert.ToDouble($($u.FromBaseToUnitFunc))";
85+
}
86+
}
87+
}
88+
6389
return $units | sort SingularName;
6490
}
6591

@@ -136,6 +162,11 @@ get-childitem -path $templatesDir -filter "*.json" | % {
136162
$json = (Get-Content $templateFile | Out-String)
137163
$unitClass = $json | ConvertFrom-Json
138164

165+
# Set default values
166+
if (!$unitClass.BaseType) {
167+
$unitClass | Add-Member BaseType "double";
168+
}
169+
139170
# Expand unit prefixes into units
140171
$unitClass.Units = GetUnits $unitClass;
141172

0 commit comments

Comments
 (0)