ng-units
Version:
Angular component library for units of measurement.
73 lines • 10.4 kB
JavaScript
import { SimpleUnit } from './unit';
import { QuantityFormatters } from './formatters';
import { QuantityParsers } from './parsers';
export class Quantity {
name;
unit;
units = [];
formatter;
parser;
constructor(definition) {
if (definition) {
this.name = definition.name;
for (const symbol of Object.keys(definition.units)) {
const def = definition.units[symbol];
this.units.push(new SimpleUnit(symbol, def[0], def[1]));
}
this.unit = this.units[0];
const formatterName = definition.formatter || 'default';
const parserName = definition.parser || 'default';
this.formatter = QuantityFormatters[formatterName];
this.parser = QuantityParsers[parserName];
}
}
fromBase(value, unit) {
const n = this.parser(value);
return isNumeric(n) ? this.getUnit(unit).fromBase(n) : null;
}
toBase(value, unit) {
const n = this.parser(value);
return isNumeric(n) ? this.getUnit(unit).toBase(n) : null;
}
getUnit(unit) {
return this.findUnit(unit) || this.unit;
}
selectUnit(unit) {
const u = this.findUnit(unit);
if (u) {
this.unit = u;
}
}
findUnit(unit) {
if (!unit) {
return;
}
const id = typeof unit === 'string' ? unit : unit.symbol;
const units = this.units;
for (let i = 0, e = units.length; i !== e; i++) {
if (units[i].symbol === id) {
return units[i];
}
}
}
/**
* Returns a string containing formatted number and unit symbol (optional).
* @param value string or number
*/
print(value, addUnitSymbol, unit) {
const number = this.parser(value);
if (typeof number !== 'number') {
return '';
}
const result = this.formatter(number);
return addUnitSymbol ? (result + ' ' + this.getUnit(unit).symbol) : result;
}
}
function isNumeric(value) {
return typeof value === 'number' && !isNaN(value);
}
export function defaultPrint(value) {
const num = QuantityParsers['default'](value);
return typeof num === 'number' ? QuantityFormatters['default'](num) : '';
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVhbnRpdHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy11bml0cy9zcmMvbGliL3F1YW50aXR5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQVEsTUFBTSxRQUFRLENBQUM7QUFDMUMsT0FBTyxFQUFxQixrQkFBa0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNyRSxPQUFPLEVBQWtCLGVBQWUsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQVc1RCxNQUFNLE9BQU8sUUFBUTtJQUNqQixJQUFJLENBQVU7SUFDZCxJQUFJLENBQVE7SUFDWixLQUFLLEdBQVcsRUFBRSxDQUFDO0lBQ25CLFNBQVMsQ0FBcUI7SUFDOUIsTUFBTSxDQUFrQjtJQUV4QixZQUFZLFVBQStCO1FBQ3ZDLElBQUksVUFBVSxFQUFFO1lBQ1osSUFBSSxDQUFDLElBQUksR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDO1lBQzVCLEtBQUssTUFBTSxNQUFNLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ2hELE1BQU0sR0FBRyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ3JDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksVUFBVSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUMzRDtZQUNELElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMxQixNQUFNLGFBQWEsR0FBRyxVQUFVLENBQUMsU0FBUyxJQUFJLFNBQVMsQ0FBQztZQUN4RCxNQUFNLFVBQVUsR0FBRyxVQUFVLENBQUMsTUFBTSxJQUFJLFNBQVMsQ0FBQztZQUNsRCxJQUFJLENBQUMsU0FBUyxHQUFHLGtCQUFrQixDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ25ELElBQUksQ0FBQyxNQUFNLEdBQUcsZUFBZSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQzdDO0lBQ0wsQ0FBQztJQUVELFFBQVEsQ0FBQyxLQUFtQyxFQUFFLElBQWtCO1FBQzVELE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDN0IsT0FBTyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDaEUsQ0FBQztJQUVELE1BQU0sQ0FBQyxLQUFtQyxFQUFFLElBQWtCO1FBQzFELE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDN0IsT0FBTyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDOUQsQ0FBQztJQUVPLE9BQU8sQ0FBQyxJQUFrQjtRQUM5QixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQztJQUM1QyxDQUFDO0lBRUQsVUFBVSxDQUFDLElBQXVCO1FBQzlCLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUIsSUFBSSxDQUFDLEVBQUU7WUFDSCxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztTQUNqQjtJQUNMLENBQUM7SUFFRCxRQUFRLENBQUMsSUFBdUI7UUFDNUIsSUFBSSxDQUFDLElBQUksRUFBRTtZQUNQLE9BQU87U0FDVjtRQUNELE1BQU0sRUFBRSxHQUFHLE9BQU8sSUFBSSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ3pELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDekIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUM1QyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssRUFBRSxFQUFFO2dCQUN4QixPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNuQjtTQUNKO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxLQUFtQyxFQUFFLGFBQXVCLEVBQUUsSUFBa0I7UUFDbEYsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNsQyxJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVEsRUFBRTtZQUM1QixPQUFPLEVBQUUsQ0FBQztTQUNiO1FBQ0QsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN0QyxPQUFPLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUMvRSxDQUFDO0NBQ0o7QUFFRCxTQUFTLFNBQVMsQ0FBQyxLQUFjO0lBQzdCLE9BQU8sT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3RELENBQUM7QUFFRCxNQUFNLFVBQVUsWUFBWSxDQUFDLEtBQW1DO0lBQzVELE1BQU0sR0FBRyxHQUFHLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM5QyxPQUFPLE9BQU8sR0FBRyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUM3RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU2ltcGxlVW5pdCwgVW5pdCB9IGZyb20gJy4vdW5pdCc7XHJcbmltcG9ydCB7IFF1YW50aXR5Rm9ybWF0dGVyLCBRdWFudGl0eUZvcm1hdHRlcnMgfSBmcm9tICcuL2Zvcm1hdHRlcnMnO1xyXG5pbXBvcnQgeyBRdWFudGl0eVBhcnNlciwgUXVhbnRpdHlQYXJzZXJzIH0gZnJvbSAnLi9wYXJzZXJzJztcclxuXHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFF1YW50aXR5RGVmaW5pdGlvbiB7XHJcbiAgICBuYW1lOiBzdHJpbmc7XHJcbiAgICB1bml0czogeyBbc3ltYm9sOiBzdHJpbmddOiBudW1iZXJbXSB9O1xyXG4gICAgZm9ybWF0dGVyPzogc3RyaW5nO1xyXG4gICAgcGFyc2VyPzogc3RyaW5nO1xyXG59XHJcblxyXG5cclxuZXhwb3J0IGNsYXNzIFF1YW50aXR5IHtcclxuICAgIG5hbWUhOiBzdHJpbmc7XHJcbiAgICB1bml0ITogVW5pdDtcclxuICAgIHVuaXRzOiBVbml0W10gPSBbXTtcclxuICAgIGZvcm1hdHRlciE6IFF1YW50aXR5Rm9ybWF0dGVyO1xyXG4gICAgcGFyc2VyITogUXVhbnRpdHlQYXJzZXI7XHJcblxyXG4gICAgY29uc3RydWN0b3IoZGVmaW5pdGlvbj86IFF1YW50aXR5RGVmaW5pdGlvbikge1xyXG4gICAgICAgIGlmIChkZWZpbml0aW9uKSB7XHJcbiAgICAgICAgICAgIHRoaXMubmFtZSA9IGRlZmluaXRpb24ubmFtZTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBzeW1ib2wgb2YgT2JqZWN0LmtleXMoZGVmaW5pdGlvbi51bml0cykpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRlZiA9IGRlZmluaXRpb24udW5pdHNbc3ltYm9sXTtcclxuICAgICAgICAgICAgICAgIHRoaXMudW5pdHMucHVzaChuZXcgU2ltcGxlVW5pdChzeW1ib2wsIGRlZlswXSwgZGVmWzFdKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy51bml0ID0gdGhpcy51bml0c1swXTtcclxuICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVyTmFtZSA9IGRlZmluaXRpb24uZm9ybWF0dGVyIHx8ICdkZWZhdWx0JztcclxuICAgICAgICAgICAgY29uc3QgcGFyc2VyTmFtZSA9IGRlZmluaXRpb24ucGFyc2VyIHx8ICdkZWZhdWx0JztcclxuICAgICAgICAgICAgdGhpcy5mb3JtYXR0ZXIgPSBRdWFudGl0eUZvcm1hdHRlcnNbZm9ybWF0dGVyTmFtZV07XHJcbiAgICAgICAgICAgIHRoaXMucGFyc2VyID0gUXVhbnRpdHlQYXJzZXJzW3BhcnNlck5hbWVdO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmcm9tQmFzZSh2YWx1ZTogc3RyaW5nfG51bWJlcnx1bmRlZmluZWR8bnVsbCwgdW5pdD86IFVuaXR8c3RyaW5nKTogbnVtYmVyfG51bGwge1xyXG4gICAgICAgIGNvbnN0IG4gPSB0aGlzLnBhcnNlcih2YWx1ZSk7XHJcbiAgICAgICAgcmV0dXJuIGlzTnVtZXJpYyhuKSA/IHRoaXMuZ2V0VW5pdCh1bml0KS5mcm9tQmFzZShuKSA6IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgdG9CYXNlKHZhbHVlOiBzdHJpbmd8bnVtYmVyfG51bGx8dW5kZWZpbmVkLCB1bml0PzogVW5pdHxzdHJpbmcpOiBudW1iZXJ8bnVsbCB7XHJcbiAgICAgICAgY29uc3QgbiA9IHRoaXMucGFyc2VyKHZhbHVlKTtcclxuICAgICAgICByZXR1cm4gaXNOdW1lcmljKG4pID8gdGhpcy5nZXRVbml0KHVuaXQpLnRvQmFzZShuKSA6IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRVbml0KHVuaXQ/OiBzdHJpbmd8VW5pdCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmZpbmRVbml0KHVuaXQpIHx8IHRoaXMudW5pdDtcclxuICAgIH1cclxuXHJcbiAgICBzZWxlY3RVbml0KHVuaXQ/OiBzdHJpbmd8VW5pdHxudWxsKSB7XHJcbiAgICAgICAgY29uc3QgdSA9IHRoaXMuZmluZFVuaXQodW5pdCk7XHJcbiAgICAgICAgaWYgKHUpIHtcclxuICAgICAgICAgICAgdGhpcy51bml0ID0gdTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZmluZFVuaXQodW5pdD86IHN0cmluZ3xVbml0fG51bGwpOiBVbml0fHVuZGVmaW5lZCB7XHJcbiAgICAgICAgaWYgKCF1bml0KSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgaWQgPSB0eXBlb2YgdW5pdCA9PT0gJ3N0cmluZycgPyB1bml0IDogdW5pdC5zeW1ib2w7XHJcbiAgICAgICAgY29uc3QgdW5pdHMgPSB0aGlzLnVuaXRzO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBlID0gdW5pdHMubGVuZ3RoOyBpICE9PSBlOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKHVuaXRzW2ldLnN5bWJvbCA9PT0gaWQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB1bml0c1tpXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyBmb3JtYXR0ZWQgbnVtYmVyIGFuZCB1bml0IHN5bWJvbCAob3B0aW9uYWwpLlxyXG4gICAgICogQHBhcmFtIHZhbHVlIHN0cmluZyBvciBudW1iZXJcclxuICAgICAqL1xyXG4gICAgcHJpbnQodmFsdWU6IHN0cmluZ3xudW1iZXJ8bnVsbHx1bmRlZmluZWQsIGFkZFVuaXRTeW1ib2w/OiBib29sZWFuLCB1bml0Pzogc3RyaW5nfFVuaXQpIHtcclxuICAgICAgICBjb25zdCBudW1iZXIgPSB0aGlzLnBhcnNlcih2YWx1ZSk7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBudW1iZXIgIT09ICdudW1iZXInKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnJztcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5mb3JtYXR0ZXIobnVtYmVyKTtcclxuICAgICAgICByZXR1cm4gYWRkVW5pdFN5bWJvbCA/IChyZXN1bHQgKyAnICcgKyB0aGlzLmdldFVuaXQodW5pdCkuc3ltYm9sKSA6IHJlc3VsdDtcclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gaXNOdW1lcmljKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgbnVtYmVyIHtcclxuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmICFpc05hTih2YWx1ZSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBkZWZhdWx0UHJpbnQodmFsdWU6IHN0cmluZ3xudW1iZXJ8dW5kZWZpbmVkfG51bGwpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgbnVtID0gUXVhbnRpdHlQYXJzZXJzWydkZWZhdWx0J10odmFsdWUpO1xyXG4gICAgcmV0dXJuIHR5cGVvZiBudW0gPT09ICdudW1iZXInID8gUXVhbnRpdHlGb3JtYXR0ZXJzWydkZWZhdWx0J10obnVtKSA6ICcnO1xyXG59XHJcbiJdfQ==