|
10 | 10 | {
|
11 | 11 | $prefixInfo = switch ($prefix)
|
12 | 12 | {
|
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; } |
21 | 21 |
|
22 | 22 | # 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 | + } |
38 | 45 |
|
39 | 46 | $prefixAbbreviation = $prefixInfo[0];
|
40 | 47 | $prefixFactor = $prefixInfo[1];
|
41 |
| - |
| 48 | + |
42 | 49 | $u = New-Object PsObject -Property @{
|
43 | 50 | SingularName=$prefix+$unit.SingularName.ToLowerInvariant();
|
44 | 51 | PluralName=$prefix+$unit.PluralName.ToLowerInvariant();
|
|
60 | 67 | }
|
61 | 68 | }
|
62 | 69 |
|
| 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 | + |
63 | 89 | return $units | sort SingularName;
|
64 | 90 | }
|
65 | 91 |
|
@@ -136,6 +162,11 @@ get-childitem -path $templatesDir -filter "*.json" | % {
|
136 | 162 | $json = (Get-Content $templateFile | Out-String)
|
137 | 163 | $unitClass = $json | ConvertFrom-Json
|
138 | 164 |
|
| 165 | + # Set default values |
| 166 | + if (!$unitClass.BaseType) { |
| 167 | + $unitClass | Add-Member BaseType "double"; |
| 168 | + } |
| 169 | + |
139 | 170 | # Expand unit prefixes into units
|
140 | 171 | $unitClass.Units = GetUnits $unitClass;
|
141 | 172 |
|
|
0 commit comments