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 = {
acres: {
factor: 1 / 4046.85642,
abbr: 'ac',
factor: (1 / (0.3048 * 0.3048)) / 43560,
abbr: 'ac',
round: 5
},
acres_us: {
factor: Math.pow(3937 / 1200, 2) / 43560,
abbr: 'ac (US)',
round: 5
},
feet: {
factor: 3.28084,
factor: 1 / 0.3048,
abbr: 'ft',
round: 4
},
feet_us:{
factor: 3937 / 1200,
abbr: 'ft (US)',
round: 4
},
hectares: {
factor: 0.0001,
abbr: 'ha',
@ -32,15 +42,25 @@ const units = {
round: 1
},
miles: {
factor: 3.28084 / 5280,
abbr: 'mi',
round: 5
factor: (1 / 0.3048) / 5280,
abbr: 'mi',
round: 5
},
miles_us: {
factor: (3937 / 1200) / 5280,
abbr: 'mi (US)',
round: 5
},
sqfeet: {
factor: 1 / 0.09290304,
factor: 1 / (0.3048 * 0.3048),
abbr: 'ft²',
round: 2
},
sqfeet_us: {
factor: Math.pow(3937 / 1200, 2),
abbr: 'ft² (US)',
round: 2
},
sqmeters: {
factor: 1,
abbr: 'm²',
@ -52,9 +72,14 @@ const units = {
round: 5
},
sqmiles: {
factor: 0.000000386102,
factor: Math.pow((1 / 0.3048) / 5280, 2),
abbr: 'mi²',
round: 5
},
sqmiles_us: {
factor: Math.pow((3937 / 1200) / 5280, 2),
abbr: 'mi² (US)',
round: 5
}
};
@ -117,24 +142,71 @@ class ImperialSystem extends UnitSystem{
getName(){
return _("Imperial");
}
feet(){
return units.feet;
}
sqfeet(){
return units.sqfeet;
}
miles(){
return units.miles;
}
sqmiles(){
return units.sqmiles;
}
acres(){
return units.acres;
}
lengthUnit(meters){
const feet = units.feet.factor * meters;
if (feet >= 5280) return units.miles;
else return units.feet;
const feet = this.feet().factor * meters;
if (feet >= 5280) return this.miles();
else return this.feet();
}
areaUnit(sqmeters){
const sqfeet = units.sqfeet.factor * sqmeters;
if (sqfeet >= 43560 && sqfeet < 27878400) return units.acres;
else if (sqfeet >= 27878400) return units.sqmiles;
else return units.sqfeet;
const sqfeet = this.sqfeet().factor * sqmeters;
if (sqfeet >= 43560 && sqfeet < 27878400) return this.acres();
else if (sqfeet >= 27878400) return this.sqmiles();
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 = {
metric: new MetricSystem(),
imperial: new ImperialSystem()
imperial: new ImperialSystem(),
imperialUS: new ImperialUSSystem()
}
// 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', () => {
const { imperial } = systems;
const { imperial, imperialUS } = systems;
const lengths = [
[1, "3.2808 ft"],
[0.01, "0.0328 ft"],
[0.0154, "0.0505 ft"],
[1609, "5,278.8716 ft"],
[1609.344, "1 mi"],
[3218.69, "2 mi"]
[1, "3.2808 ft", "3.2808 ft (US)"],
[0.01, "0.0328 ft", "0.0328 ft (US)"],
[0.0154, "0.0505 ft", "0.0505 ft (US)"],
[1609, "5,278.8714 ft", "5,278.8608 ft (US)"],
[1609.344, "1 mi", "5,279.9894 ft (US)"],
[1609.3472187, "1 mi", "1 mi (US)"],
[3218.69, "2 mi", "2 mi (US)"]
];
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 = [
[1, "10.76 ft²"],
[9999, "2.47081 ac"],
[4046.86, "1 ac"],
[2587398.1, "639.35999 ac"],
[2.59e+6, "1 mi²"]
[1, "10.76 ft²", "10.76 ft² (US)"],
[9999, "2.47081 ac", "2.4708 ac (US)"],
[4046.86, "1 ac", "43,559.86 ft² (US)"],
[4046.87261, "1 ac", "1 ac (US)"],
[2587398.1, "639.35999 ac", "639.35744 ac (US)"],
[2.59e+6, "1 mi²", "1 mi² (US)"]
];
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]);
});
})
});