Skip to content

Commit 41e9d3b

Browse files
committed
Implementend US and imperial volume units with unit tests:
CubicMiles, CubicYards, CubicFeet, CubicInches, UsGallons, UsOunces, ImperialGallons, ImperialOunces.
1 parent 4b2e366 commit 41e9d3b

File tree

5 files changed

+178
-1
lines changed

5 files changed

+178
-1
lines changed

Src/UnitsNet/Unit.cs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,16 @@ public enum Unit
114114
Deciliter,
115115
Centiliter,
116116
Milliliter,
117-
//Gallon,
117+
118+
// Volume US/Imperial
119+
CubicMile,
120+
CubicYard,
121+
CubicFoot,
122+
CubicInch,
123+
UsGallon,
124+
UsOunce,
125+
ImperialGallon,
126+
ImperialOunce,
118127

119128
// Torque
120129
Newtonmeter,

Src/UnitsNet/UnitConverter.cs

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,7 @@ private static bool TryConvertVolume(double value, Unit fromUnit, Unit toUnit, o
258258
return TryConvert(Volume.FromCubicCentimeters(value), toUnit, out newValue);
259259
case Unit.CubicMillimeter:
260260
return TryConvert(Volume.FromCubicMillimeters(value), toUnit, out newValue);
261+
261262
case Unit.Hectoliter:
262263
return TryConvert(Volume.FromHectoliters(value), toUnit, out newValue);
263264
case Unit.Liter:
@@ -269,6 +270,24 @@ private static bool TryConvertVolume(double value, Unit fromUnit, Unit toUnit, o
269270
case Unit.Milliliter:
270271
return TryConvert(Volume.FromMilliliters(value), toUnit, out newValue);
271272

273+
case Unit.CubicMile:
274+
return TryConvert(Volume.FromCubicMiles(value), toUnit, out newValue);
275+
case Unit.CubicYard:
276+
return TryConvert(Volume.FromCubicYards(value), toUnit, out newValue);
277+
case Unit.CubicFoot:
278+
return TryConvert(Volume.FromCubicFeet(value), toUnit, out newValue);
279+
case Unit.CubicInch:
280+
return TryConvert(Volume.FromCubicInches(value), toUnit, out newValue);
281+
282+
case Unit.UsGallon:
283+
return TryConvert(Volume.FromUsGallons(value), toUnit, out newValue);
284+
case Unit.UsOunce:
285+
return TryConvert(Volume.FromUsOunces(value), toUnit, out newValue);
286+
case Unit.ImperialGallon:
287+
return TryConvert(Volume.FromImperialGallons(value), toUnit, out newValue);
288+
case Unit.ImperialOunce:
289+
return TryConvert(Volume.FromImperialOunces(value), toUnit, out newValue);
290+
272291
default:
273292
newValue = 0;
274293
return false;
@@ -415,6 +434,7 @@ private static bool TryConvert(Volume volume, Unit toUnit, out double newValue)
415434
case Unit.CubicMillimeter:
416435
newValue = volume.CubicMillimeters;
417436
return true;
437+
418438
case Unit.Hectoliter:
419439
newValue = volume.Hectoliters;
420440
return true;
@@ -431,6 +451,32 @@ private static bool TryConvert(Volume volume, Unit toUnit, out double newValue)
431451
newValue = volume.Milliliters;
432452
return true;
433453

454+
case Unit.CubicMile:
455+
newValue = volume.CubicMiles;
456+
return true;
457+
case Unit.CubicYard:
458+
newValue = volume.CubicYards;
459+
return true;
460+
case Unit.CubicFoot:
461+
newValue = volume.CubicFeet;
462+
return true;
463+
case Unit.CubicInch:
464+
newValue = volume.CubicInches;
465+
return true;
466+
467+
case Unit.UsGallon:
468+
newValue = volume.UsGallons;
469+
return true;
470+
case Unit.UsOunce:
471+
newValue = volume.UsOunces;
472+
return true;
473+
case Unit.ImperialGallon:
474+
newValue = volume.ImperialGallons;
475+
return true;
476+
case Unit.ImperialOunce:
477+
newValue = volume.ImperialOunces;
478+
return true;
479+
434480
default:
435481
newValue = 0;
436482
return false;

Src/UnitsNet/Volume.cs

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,23 @@ public struct Volume : IComparable, IComparable<Volume>
3232
private const double CubicDecimetersToCubicMetersRatio = 1E-3;
3333
private const double CubicCentimetersToCubicMetersRatio = 1E-6;
3434
private const double CubicMillimetersToCubicMetersRatio = 1E-9;
35+
3536
private const double HectolitersToCubicMetersRatio = 1E-1;
3637
private const double LitersToCubicMetersRatio = 1E-3;
3738
private const double DecilitersToCubicMetersRatio = 1E-4;
3839
private const double CentilitersToCubicMetersRatio = 1E-5;
3940
private const double MillilitersToCubicMetersRatio = 1E-6;
4041

42+
private const double CubicMilesToCubicMetersRatio = 4.16818183 * 1E9;
43+
private const double CubicYardsToCubicMetersRatio = 0.764554858;
44+
private const double CubicFeetToCubicMetersRatio = 0.0283168;
45+
private const double CubicInchesToCubicMetersRatio = 1.6387e-5;
46+
47+
private const double UsGallonToCubicMeterRatio = 0.00378541;
48+
private const double UsOunceToCubicMeterRatio = 2.957352956253760505068307980135e-5;
49+
private const double ImperialGallonToCubicMeterRatio = 0.00454609000000181429905810072407;
50+
private const double ImperialOunceToCubicMeterRatio = 2.8413062499962901241875439064617e-5;
51+
4152
public readonly double CubicMeters;
4253

4354
/// <summary>
@@ -96,6 +107,46 @@ public double Milliliters
96107
get { return CubicMeters/MillilitersToCubicMetersRatio; }
97108
}
98109

110+
public double CubicMiles
111+
{
112+
get { return CubicMeters/CubicMilesToCubicMetersRatio; }
113+
}
114+
115+
public double CubicYards
116+
{
117+
get { return CubicMeters/CubicYardsToCubicMetersRatio; }
118+
}
119+
120+
public double CubicFeet
121+
{
122+
get { return CubicMeters/CubicFeetToCubicMetersRatio; }
123+
}
124+
125+
public double CubicInches
126+
{
127+
get { return CubicMeters/CubicInchesToCubicMetersRatio; }
128+
}
129+
130+
public double UsGallons
131+
{
132+
get { return CubicMeters/UsGallonToCubicMeterRatio; }
133+
}
134+
135+
public double UsOunces
136+
{
137+
get { return CubicMeters/UsOunceToCubicMeterRatio; }
138+
}
139+
140+
public double ImperialGallons
141+
{
142+
get { return CubicMeters/ImperialGallonToCubicMeterRatio; }
143+
}
144+
145+
public double ImperialOunces
146+
{
147+
get { return CubicMeters/ImperialOunceToCubicMeterRatio; }
148+
}
149+
99150
#endregion
100151

101152
#region Static
@@ -171,6 +222,46 @@ public static Volume FromMilliliters(double milliliters)
171222
return new Volume(milliliters*MillilitersToCubicMetersRatio);
172223
}
173224

225+
public static Volume FromCubicMiles(double cubicMiles)
226+
{
227+
return new Volume(cubicMiles*CubicMilesToCubicMetersRatio);
228+
}
229+
230+
public static Volume FromCubicYards(double cubicYards)
231+
{
232+
return new Volume(cubicYards*CubicYardsToCubicMetersRatio);
233+
}
234+
235+
public static Volume FromCubicFeet(double cubicFeet)
236+
{
237+
return new Volume(cubicFeet*CubicFeetToCubicMetersRatio);
238+
}
239+
240+
public static Volume FromCubicInches(double cubicInches)
241+
{
242+
return new Volume(cubicInches*CubicInchesToCubicMetersRatio);
243+
}
244+
245+
public static Volume FromUsGallons(double usGallons)
246+
{
247+
return new Volume(usGallons*UsGallonToCubicMeterRatio);
248+
}
249+
250+
public static Volume FromUsOunces(double usOunces)
251+
{
252+
return new Volume(usOunces*UsOunceToCubicMeterRatio);
253+
}
254+
255+
public static Volume FromImperialGallons(double imperialGallons)
256+
{
257+
return new Volume(imperialGallons*ImperialGallonToCubicMeterRatio);
258+
}
259+
260+
public static Volume FromImperialOunces(double imperialOunces)
261+
{
262+
return new Volume(imperialOunces*ImperialOunceToCubicMeterRatio);
263+
}
264+
174265
#endregion
175266

176267
#region Arithmetic operators

Tests/UnitConverterTests.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,22 @@ public void CubicMeterToVolumeUnits()
3535
Assert.AreEqual(1E3, UnitConverter.Convert(1, Unit.CubicMeter, Unit.CubicDecimeter), Delta);
3636
Assert.AreEqual(1E6, UnitConverter.Convert(1, Unit.CubicMeter, Unit.CubicCentimeter), Delta);
3737
Assert.AreEqual(1E9, UnitConverter.Convert(1, Unit.CubicMeter, Unit.CubicMillimeter), Delta);
38+
3839
Assert.AreEqual(1E1, UnitConverter.Convert(1, Unit.CubicMeter, Unit.Hectoliter), Delta);
3940
Assert.AreEqual(1E3, UnitConverter.Convert(1, Unit.CubicMeter, Unit.Liter), Delta);
4041
Assert.AreEqual(1E4, UnitConverter.Convert(1, Unit.CubicMeter, Unit.Deciliter), Delta);
4142
Assert.AreEqual(1E5, UnitConverter.Convert(1, Unit.CubicMeter, Unit.Centiliter), Delta);
4243
Assert.AreEqual(1E6, UnitConverter.Convert(1, Unit.CubicMeter, Unit.Milliliter), Delta);
44+
45+
Assert.AreEqual(3.86102*1E-7, UnitConverter.Convert(1, Unit.CubicMeter, Unit.CubicMile), Delta);
46+
Assert.AreEqual(1.30795062, UnitConverter.Convert(1, Unit.CubicMeter, Unit.CubicYard), Delta);
47+
Assert.AreEqual(35.31472, UnitConverter.Convert(1, Unit.CubicMeter, Unit.CubicFoot), Delta);
48+
Assert.AreEqual(61023.98242, UnitConverter.Convert(1, Unit.CubicMeter, Unit.CubicInch), Delta);
49+
50+
Assert.AreEqual(264.17217, UnitConverter.Convert(1, Unit.CubicMeter, Unit.UsGallon), Delta);
51+
Assert.AreEqual(33814.02270, UnitConverter.Convert(1, Unit.CubicMeter, Unit.UsOunce), Delta);
52+
Assert.AreEqual(219.96924, UnitConverter.Convert(1, Unit.CubicMeter, Unit.ImperialGallon), Delta);
53+
Assert.AreEqual(35195.07972, UnitConverter.Convert(1, Unit.CubicMeter, Unit.ImperialOunce), Delta);
4354
}
4455

4556
[Test]

Tests/VolumeTests.cs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,16 @@ public void CubicMetersToVolumeUnits()
2323
Assert.AreEqual(1E4, _cubicMeter.Deciliters, Delta);
2424
Assert.AreEqual(1E5, _cubicMeter.Centiliters, Delta);
2525
Assert.AreEqual(1E6, _cubicMeter.Milliliters, Delta);
26+
27+
Assert.AreEqual(3.86102*1E-7, _cubicMeter.CubicMiles, Delta);
28+
Assert.AreEqual(1.30795062, _cubicMeter.CubicYards, Delta);
29+
Assert.AreEqual(35.31472, _cubicMeter.CubicFeet, Delta);
30+
Assert.AreEqual(61023.98242, _cubicMeter.CubicInches, Delta);
31+
32+
Assert.AreEqual(264.17217, _cubicMeter.UsGallons, Delta);
33+
Assert.AreEqual(33814.02270, _cubicMeter.UsOunces, Delta);
34+
Assert.AreEqual(219.96924, _cubicMeter.ImperialGallons, Delta);
35+
Assert.AreEqual(35195.07972, _cubicMeter.ImperialOunces, Delta);
2636
}
2737

2838
[Test]
@@ -39,6 +49,16 @@ public void VolumeUnitsRoundTrip()
3949
Assert.AreEqual(1, Volume.FromDeciliters(_cubicMeter.Deciliters).CubicMeters, Delta);
4050
Assert.AreEqual(1, Volume.FromCentiliters(_cubicMeter.Centiliters).CubicMeters, Delta);
4151
Assert.AreEqual(1, Volume.FromMilliliters(_cubicMeter.Milliliters).CubicMeters, Delta);
52+
53+
Assert.AreEqual(1, Volume.FromCubicMiles(_cubicMeter.CubicMiles).CubicMeters, Delta);
54+
Assert.AreEqual(1, Volume.FromCubicYards(_cubicMeter.CubicYards).CubicMeters, Delta);
55+
Assert.AreEqual(1, Volume.FromCubicFeet(_cubicMeter.CubicFeet).CubicMeters, Delta);
56+
Assert.AreEqual(1, Volume.FromCubicMiles(_cubicMeter.CubicMiles).CubicMeters, Delta);
57+
58+
Assert.AreEqual(1, Volume.FromUsGallons(_cubicMeter.UsGallons).CubicMeters, Delta);
59+
Assert.AreEqual(1, Volume.FromUsOunces(_cubicMeter.UsOunces).CubicMeters, Delta);
60+
Assert.AreEqual(1, Volume.FromImperialGallons(_cubicMeter.ImperialGallons).CubicMeters, Delta);
61+
Assert.AreEqual(1, Volume.FromImperialOunces(_cubicMeter.ImperialOunces).CubicMeters, Delta);
4262
}
4363

4464
[Test]

0 commit comments

Comments
 (0)