Add US imperial

pull/1496/head
Piero Toffanin 2024-05-09 11:08:51 -04:00
rodzic ece6bba200
commit adf9c7dc5f
2 zmienionych plików z 107 dodań i 31 usunięć

Wyświetl plik

@ -2,15 +2,25 @@ import { _ } from './gettext';
const units = { const units = {
acres: { acres: {
factor: 1 / 4046.85642, factor: (1 / (0.3048 * 0.3048)) / 43560,
abbr: 'ac', abbr: 'ac',
round: 5
},
acres_us: {
factor: Math.pow(3937 / 1200, 2) / 43560,
abbr: 'ac (US)',
round: 5 round: 5
}, },
feet: { feet: {
factor: 3.28084, factor: 1 / 0.3048,
abbr: 'ft', abbr: 'ft',
round: 4 round: 4
}, },
feet_us:{
factor: 3937 / 1200,
abbr: 'ft (US)',
round: 4
},
hectares: { hectares: {
factor: 0.0001, factor: 0.0001,
abbr: 'ha', abbr: 'ha',
@ -32,15 +42,25 @@ const units = {
round: 1 round: 1
}, },
miles: { miles: {
factor: 3.28084 / 5280, factor: (1 / 0.3048) / 5280,
abbr: 'mi', abbr: 'mi',
round: 5 round: 5
},
miles_us: {
factor: (3937 / 1200) / 5280,
abbr: 'mi (US)',
round: 5
}, },
sqfeet: { sqfeet: {
factor: 1 / 0.09290304, factor: 1 / (0.3048 * 0.3048),
abbr: 'ft²', abbr: 'ft²',
round: 2 round: 2
}, },
sqfeet_us: {
factor: Math.pow(3937 / 1200, 2),
abbr: 'ft² (US)',
round: 2
},
sqmeters: { sqmeters: {
factor: 1, factor: 1,
abbr: 'm²', abbr: 'm²',
@ -52,9 +72,14 @@ const units = {
round: 5 round: 5
}, },
sqmiles: { sqmiles: {
factor: 0.000000386102, factor: Math.pow((1 / 0.3048) / 5280, 2),
abbr: 'mi²', abbr: 'mi²',
round: 5 round: 5
},
sqmiles_us: {
factor: Math.pow((3937 / 1200) / 5280, 2),
abbr: 'mi² (US)',
round: 5
} }
}; };
@ -118,23 +143,70 @@ class ImperialSystem extends UnitSystem{
return _("Imperial"); return _("Imperial");
} }
feet(){
return units.feet;
}
sqfeet(){
return units.sqfeet;
}
miles(){
return units.miles;
}
sqmiles(){
return units.sqmiles;
}
acres(){
return units.acres;
}
lengthUnit(meters){ lengthUnit(meters){
const feet = units.feet.factor * meters; const feet = this.feet().factor * meters;
if (feet >= 5280) return units.miles; if (feet >= 5280) return this.miles();
else return units.feet; else return this.feet();
} }
areaUnit(sqmeters){ areaUnit(sqmeters){
const sqfeet = units.sqfeet.factor * sqmeters; const sqfeet = this.sqfeet().factor * sqmeters;
if (sqfeet >= 43560 && sqfeet < 27878400) return units.acres; if (sqfeet >= 43560 && sqfeet < 27878400) return this.acres();
else if (sqfeet >= 27878400) return units.sqmiles; else if (sqfeet >= 27878400) return this.sqmiles();
else return units.sqfeet; else return this.sqfeet();
}
}
class ImperialUSSystem extends ImperialSystem{
getName(){
return _("Imperial (US)");
}
feet(){
return units.feet_us;
}
sqfeet(){
return units.sqfeet_us;
}
miles(){
return units.miles_us;
}
sqmiles(){
return units.sqmiles_us;
}
acres(){
return units.acres_us;
} }
} }
const systems = { const systems = {
metric: new MetricSystem(), metric: new MetricSystem(),
imperial: new ImperialSystem() imperial: new ImperialSystem(),
imperialUS: new ImperialUSSystem()
} }
// Expose to allow every part of the app to access this information // Expose to allow every part of the app to access this information

Wyświetl plik

@ -41,34 +41,38 @@ describe('Metric system', () => {
}) })
}); });
describe('Imperial system', () => { describe('Imperial systems', () => {
it('it should display units properly', () => { it('it should display units properly', () => {
const { imperial } = systems; const { imperial, imperialUS } = systems;
const lengths = [ const lengths = [
[1, "3.2808 ft"], [1, "3.2808 ft", "3.2808 ft (US)"],
[0.01, "0.0328 ft"], [0.01, "0.0328 ft", "0.0328 ft (US)"],
[0.0154, "0.0505 ft"], [0.0154, "0.0505 ft", "0.0505 ft (US)"],
[1609, "5,278.8716 ft"], [1609, "5,278.8714 ft", "5,278.8608 ft (US)"],
[1609.344, "1 mi"], [1609.344, "1 mi", "5,279.9894 ft (US)"],
[3218.69, "2 mi"] [1609.3472187, "1 mi", "1 mi (US)"],
[3218.69, "2 mi", "2 mi (US)"]
]; ];
lengths.forEach(l => { lengths.forEach(l => {
expect(imperial.length(l[0]).toString()).toBe(l[1]); expect(imperial.length(l[0]).toString()).toBe(l[1]);
expect(imperialUS.length(l[0]).toString()).toBe(l[2]);
}); });
const areas = [ const areas = [
[1, "10.76 ft²"], [1, "10.76 ft²", "10.76 ft² (US)"],
[9999, "2.47081 ac"], [9999, "2.47081 ac", "2.4708 ac (US)"],
[4046.86, "1 ac"], [4046.86, "1 ac", "43,559.86 ft² (US)"],
[2587398.1, "639.35999 ac"], [4046.87261, "1 ac", "1 ac (US)"],
[2.59e+6, "1 mi²"] [2587398.1, "639.35999 ac", "639.35744 ac (US)"],
[2.59e+6, "1 mi²", "1 mi² (US)"]
]; ];
areas.forEach(a => { areas.forEach(a => {
expect(imperial.area(a[0]).toString()).toBe(a[1]); expect(imperial.area(a[0]).toString()).toBe(a[1]);
expect(imperialUS.area(a[0]).toString()).toBe(a[2]);
}); });
}) })
}); });