@itwin/core-quantity 5.2.0-dev.3 → 5.2.0-dev.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +51 -1
- package/lib/cjs/Constants.js.map +1 -1
- package/lib/cjs/Exception.js.map +1 -1
- package/lib/cjs/Formatter/Format.js.map +1 -1
- package/lib/cjs/Formatter/FormatEnums.js.map +1 -1
- package/lib/cjs/Formatter/Formatter.js.map +1 -1
- package/lib/cjs/Formatter/FormatterSpec.js.map +1 -1
- package/lib/cjs/Formatter/Interfaces.d.ts +11 -0
- package/lib/cjs/Formatter/Interfaces.d.ts.map +1 -1
- package/lib/cjs/Formatter/Interfaces.js.map +1 -1
- package/lib/cjs/Interfaces.js.map +1 -1
- package/lib/cjs/Parser.js.map +1 -1
- package/lib/cjs/ParserSpec.js.map +1 -1
- package/lib/cjs/Quantity.js.map +1 -1
- package/lib/cjs/Unit.js.map +1 -1
- package/lib/cjs/core-quantity.js.map +1 -1
- package/lib/esm/Constants.js.map +1 -1
- package/lib/esm/Exception.js.map +1 -1
- package/lib/esm/Formatter/Format.js.map +1 -1
- package/lib/esm/Formatter/FormatEnums.js.map +1 -1
- package/lib/esm/Formatter/Formatter.js.map +1 -1
- package/lib/esm/Formatter/FormatterSpec.js.map +1 -1
- package/lib/esm/Formatter/Interfaces.d.ts +11 -0
- package/lib/esm/Formatter/Interfaces.d.ts.map +1 -1
- package/lib/esm/Formatter/Interfaces.js.map +1 -1
- package/lib/esm/Interfaces.js.map +1 -1
- package/lib/esm/Parser.js.map +1 -1
- package/lib/esm/ParserSpec.js.map +1 -1
- package/lib/esm/Quantity.js.map +1 -1
- package/lib/esm/Unit.js.map +1 -1
- package/lib/esm/core-quantity.js.map +1 -1
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Format.js","sourceRoot":"","sources":["../../../src/Formatter/Format.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Quantity\n */\n\nimport { QuantityConstants } from \"../Constants\";\nimport { QuantityError, QuantityStatus } from \"../Exception\";\nimport { UnitProps, UnitsProvider } from \"../Interfaces\";\nimport {\n DecimalPrecision, FormatTraits, formatTraitsToArray, FormatType, FractionalPrecision,\n getTraitString, parseFormatTrait, parseFormatType, parsePrecision, parseRatioType, parseScientificType, parseShowSignOption,\n RatioType, ScientificType,\n ShowSignOption,\n} from \"./FormatEnums\";\nimport { CloneOptions, CustomFormatProps, FormatProps, isCustomFormatProps } from \"./Interfaces\";\n\n// cSpell:ignore ZERONORMALIZED, nosign, onlynegative, signalways, negativeparentheses\n// cSpell:ignore trailzeroes, keepsinglezero, zeroempty, keepdecimalpoint, applyrounding, fractiondash, showunitlabel, prependunitlabel, exponentonlynegative\n\n/** A base Format class with shared properties and functionality between quantity and ecschema-metadata Format classes\n * @beta\n */\nexport class BaseFormat {\n private _name = \"\";\n protected _roundFactor: number = 0.0;\n protected _type: FormatType = FormatType.Decimal; // required; options are decimal, fractional, scientific, station\n protected _precision: number = DecimalPrecision.Six; // required\n protected _showSignOption: ShowSignOption = ShowSignOption.OnlyNegative; // options: noSign, onlyNegative, signAlways, negativeParentheses\n protected _decimalSeparator: string = QuantityConstants.LocaleSpecificDecimalSeparator;\n protected _thousandSeparator: string = QuantityConstants.LocaleSpecificThousandSeparator;\n protected _uomSeparator = \" \"; // optional; default is \" \"; defined separator between magnitude and the unit\n protected _stationSeparator = \"+\"; // optional; default is \"+\"\n protected _formatTraits: FormatTraits = FormatTraits.Uninitialized;\n protected _spacer: string = \" \"; // optional; default is \" \"\n protected _includeZero: boolean = true; // optional; default is true\n protected _minWidth?: number; // optional; positive int\n protected _scientificType?: ScientificType; // required if type is scientific; options: normalized, zeroNormalized\n protected _stationOffsetSize?: number; // required when type is station; positive integer > 0\n protected _stationBaseFactor?: number; // optional positive integer base factor for station formatting; default is 1\n protected _ratioType?: RatioType; // required if type is ratio; options: oneToN, NToOne, ValueBased, useGreatestCommonDivisor\n protected _azimuthBase?: number; // value always clockwise from north\n protected _azimuthBaseUnit?: UnitProps; // unit for azimuthBase value\n protected _azimuthCounterClockwise?: boolean; // if set to true, azimuth values are returned counter-clockwise from base\n protected _revolutionUnit?: UnitProps; // unit that represents a revolution, required for bearing or azimuth types\n protected _allowMathematicOperations: boolean = false; // optional; enables calculating mathematic operations like addition and subtraction; default is false.\n\n constructor(name: string) {\n this._name = name;\n }\n\n public get name(): string { return this._name; }\n\n public get roundFactor(): number { return this._roundFactor; }\n public set roundFactor(roundFactor: number) { this._roundFactor = roundFactor; }\n\n public get type(): FormatType { return this._type; }\n public set type(formatType: FormatType) { this._type = formatType; }\n\n public get precision(): DecimalPrecision | FractionalPrecision { return this._precision; }\n public set precision(precision: DecimalPrecision | FractionalPrecision) { this._precision = precision; }\n\n public get minWidth(): number | undefined { return this._minWidth; }\n public set minWidth(minWidth: number | undefined) { this._minWidth = minWidth; }\n\n public get scientificType(): ScientificType | undefined { return this._scientificType; }\n public set scientificType(scientificType: ScientificType | undefined) { this._scientificType = scientificType; }\n\n public get ratioType(): RatioType | undefined { return this._ratioType; }\n public set ratioType(ratioType: RatioType | undefined) { this._ratioType = ratioType; }\n\n public get showSignOption(): ShowSignOption { return this._showSignOption; }\n public set showSignOption(showSignOption: ShowSignOption) { this._showSignOption = showSignOption; }\n\n public get decimalSeparator(): string { return this._decimalSeparator; }\n public set decimalSeparator(decimalSeparator: string) { this._decimalSeparator = decimalSeparator; }\n\n public get thousandSeparator(): string { return this._thousandSeparator; }\n public set thousandSeparator(thousandSeparator: string) { this._thousandSeparator = thousandSeparator; }\n\n public get uomSeparator(): string { return this._uomSeparator; }\n public set uomSeparator(uomSeparator: string) { this._uomSeparator = uomSeparator; }\n\n public get stationSeparator(): string { return this._stationSeparator; }\n public set stationSeparator(stationSeparator: string) { this._stationSeparator = stationSeparator; }\n\n public get stationOffsetSize(): number | undefined { return this._stationOffsetSize; }\n public set stationOffsetSize(stationOffsetSize: number | undefined) { stationOffsetSize = this._stationOffsetSize = stationOffsetSize; }\n\n /** Gets the station base factor used for station formatting. This is a positive integer that acts as a multiplier\n * for the base offset calculation. The default value is 1.\n */\n public get stationBaseFactor(): number | undefined {\n return this._stationBaseFactor;\n }\n public set stationBaseFactor(stationBaseFactor: number | undefined) {\n this._stationBaseFactor = stationBaseFactor;\n }\n\n public get allowMathematicOperations(): boolean { return this._allowMathematicOperations; }\n public set allowMathematicOperations(allowMathematicOperations: boolean) { this._allowMathematicOperations = allowMathematicOperations; }\n\n public get formatTraits(): FormatTraits { return this._formatTraits; }\n public set formatTraits(formatTraits: FormatTraits) { this._formatTraits = formatTraits; }\n\n public get spacer(): string | undefined { return this._spacer; }\n public set spacer(spacer: string | undefined) { this._spacer = spacer ?? this._spacer; }\n public get spacerOrDefault(): string { return this._spacer ?? \" \"; }\n\n public get includeZero(): boolean | undefined { return this._includeZero; }\n public set includeZero(includeZero: boolean | undefined) { this._includeZero = includeZero ?? this._includeZero; }\n\n // default \"north\" is applied by the formatter (quarter rotation counter clockwise from east, the value depends on the units used)\n public get azimuthBase(): number | undefined { return this._azimuthBase; }\n public set azimuthBase(azimuthBase: number | undefined) { this._azimuthBase = azimuthBase; }\n\n public get azimuthBaseUnit(): UnitProps | undefined { return this._azimuthBaseUnit; }\n public set azimuthBaseUnit(azimuthBaseUnit: UnitProps | undefined) { this._azimuthBaseUnit = azimuthBaseUnit; }\n\n public get azimuthCounterClockwise(): boolean | undefined { return this._azimuthCounterClockwise; }\n public set azimuthCounterClockwise(azimuthCounterClockwise: boolean | undefined) { this._azimuthCounterClockwise = azimuthCounterClockwise; }\n public get azimuthClockwiseOrDefault(): boolean { return !this._azimuthCounterClockwise; }\n\n public get revolutionUnit(): UnitProps | undefined { return this._revolutionUnit; }\n public set revolutionUnit(revolutionUnit: UnitProps | undefined) { this._revolutionUnit = revolutionUnit; }\n\n /** This method parses input string that is typically extracted for persisted JSON data and validates that the string is a valid FormatType. Throws exception if not valid. */\n public parseFormatTraits(formatTraitsFromJson: string | string[]) {\n const formatTraits = (Array.isArray(formatTraitsFromJson)) ? formatTraitsFromJson : formatTraitsFromJson.split(/,|;|\\|/);\n formatTraits.forEach((formatTraitsString: string) => { // for each element in the string array\n const formatTrait = parseFormatTrait(formatTraitsString, this.name);\n this._formatTraits = this.formatTraits | formatTrait;\n });\n }\n\n /** This method returns true if the formatTrait is set in this Format object. */\n public hasFormatTraitSet(formatTrait: FormatTraits): boolean {\n return (this._formatTraits & formatTrait) === formatTrait;\n }\n\n public loadFormatProperties(formatProps: FormatProps) {\n this._type = parseFormatType(formatProps.type, this.name);\n\n if (formatProps.precision !== undefined) {\n if (!Number.isInteger(formatProps.precision)) // mut be an integer\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has an invalid 'precision' attribute. It should be an integer.`);\n\n this._precision = parsePrecision(formatProps.precision, this._type, this.name);\n }\n if (this.type === FormatType.Scientific) {\n if (undefined === formatProps.scientificType) // if format type is scientific and scientific type is undefined, throw\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} is 'Scientific' type therefore the attribute 'scientificType' is required.`);\n\n this._scientificType = parseScientificType(formatProps.scientificType, this.name);\n }\n\n if (this.type === FormatType.Ratio){\n if (undefined === formatProps.ratioType)\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} is 'Ratio' type therefore the attribute 'ratioType' is required.`);\n\n this._ratioType = parseRatioType(formatProps.ratioType, this.name);\n }\n\n if (undefined !== formatProps.roundFactor) { // optional; default is 0.0\n if (typeof (formatProps.roundFactor) !== \"number\")\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has an invalid 'roundFactor' attribute. It should be of type 'number'.`);\n if (formatProps.roundFactor !== this.roundFactor) // if roundFactor isn't default value of 0.0, reassign roundFactor variable\n this._roundFactor = formatProps.roundFactor;\n }\n\n if (undefined !== formatProps.minWidth) { // optional\n if (!Number.isInteger(formatProps.minWidth) || formatProps.minWidth < 0) // must be a positive int\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has an invalid 'minWidth' attribute. It should be a positive integer.`);\n this._minWidth = formatProps.minWidth;\n }\n if (FormatType.Station === this.type) {\n if (undefined === formatProps.stationOffsetSize)\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} is 'Station' type therefore the attribute 'stationOffsetSize' is required.`);\n if (!Number.isInteger(formatProps.stationOffsetSize) || formatProps.stationOffsetSize <= 0) // must be a positive int > 0\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has an invalid 'stationOffsetSize' attribute. It should be a positive integer.`);\n this._stationOffsetSize = formatProps.stationOffsetSize;\n\n if (undefined !== formatProps.stationBaseFactor) {\n // optional - must be a positive integer\n if (!Number.isInteger(formatProps.stationBaseFactor) || formatProps.stationBaseFactor <= 0)\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has an invalid 'stationBaseFactor' attribute. It should be a positive integer.`);\n this._stationBaseFactor = formatProps.stationBaseFactor;\n }\n }\n\n if (undefined !== formatProps.showSignOption) { // optional; default is \"onlyNegative\"\n this._showSignOption = parseShowSignOption(formatProps.showSignOption, this.name);\n }\n\n if (undefined !== formatProps.formatTraits && formatProps.formatTraits.length !== 0) { // FormatTraits is optional\n if (!Array.isArray(formatProps.formatTraits) && typeof (formatProps.formatTraits) !== \"string\") // must be either an array of strings or a string\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has an invalid 'formatTraits' attribute. It should be of type 'string' or 'string[]'.`);\n this.parseFormatTraits(formatProps.formatTraits); // check that all of the options for formatTraits are valid. If now, throw\n }\n\n if (undefined !== formatProps.decimalSeparator) { // optional\n if (typeof (formatProps.decimalSeparator) !== \"string\") // not a string or not a one character string\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has an invalid 'decimalSeparator' attribute. It should be of type 'string'.`);\n if (formatProps.decimalSeparator.length > 1)\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has an invalid 'decimalSeparator' attribute. It should be an empty or one character string.`);\n this._decimalSeparator = formatProps.decimalSeparator;\n }\n\n if (undefined !== formatProps.thousandSeparator) { // optional\n if (typeof (formatProps.thousandSeparator) !== \"string\")\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has an invalid 'thousandSeparator' attribute. It should be of type 'string'.`);\n if (formatProps.thousandSeparator.length > 1)\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has an invalid 'thousandSeparator' attribute. It should be an empty or one character string.`);\n this._thousandSeparator = formatProps.thousandSeparator;\n }\n\n if (undefined !== formatProps.uomSeparator) { // optional; default is \" \"\n if (typeof (formatProps.uomSeparator) !== \"string\")\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has an invalid 'uomSeparator' attribute. It should be of type 'string'.`);\n if (formatProps.uomSeparator.length < 0 || formatProps.uomSeparator.length > 1)\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has an invalid 'uomSeparator' attribute. It should be an empty or one character string.`);\n this._uomSeparator = formatProps.uomSeparator;\n }\n\n if (undefined !== formatProps.stationSeparator) { // optional; default is \"+\"\n if (typeof (formatProps.stationSeparator) !== \"string\")\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has an invalid 'stationSeparator' attribute. It should be of type 'string'.`);\n if (formatProps.stationSeparator.length > 1)\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has an invalid 'stationSeparator' attribute. It should be an empty or one character string.`);\n this._stationSeparator = formatProps.stationSeparator;\n }\n\n if (undefined !== formatProps.azimuthBase) { // optional; default is a quarter rotation (90 degrees) which represents north\n if (typeof (formatProps.azimuthBase) !== \"number\")\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has an invalid 'azimuthBase' attribute. It should be of type 'number'.`);\n this._azimuthBase = formatProps.azimuthBase;\n }\n\n if (undefined !== formatProps.azimuthCounterClockwise) { // optional; default is false\n if (typeof (formatProps.azimuthCounterClockwise) !== \"boolean\")\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has an invalid 'azimuthCounterClockwise' attribute. It should be of type 'boolean'.`);\n this._azimuthCounterClockwise = formatProps.azimuthCounterClockwise;\n }\n if (undefined !== formatProps.allowMathematicOperations) { // optional; default is false\n if (typeof (formatProps.allowMathematicOperations) !== \"boolean\")\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has an invalid 'allowMathematicOperations' attribute. It should be of type 'boolean'.`);\n this._allowMathematicOperations = formatProps.allowMathematicOperations;\n }\n }\n}\n\n/** A class used to define the specifications for formatting quantity values. This class is typically loaded by reading [[FormatProps]].\n * @beta\n */\nexport class Format extends BaseFormat {\n protected _units?: Array<[UnitProps, string | undefined]>;\n protected _customProps?: any; // used by custom formatters and parsers\n\n /** Constructor\n * @param name The name of a format specification. TODO: make optional or remove\n */\n constructor(name: string) {\n super(name);\n }\n\n public get units(): Array<[UnitProps, string | undefined]> | undefined { return this._units; }\n public get hasUnits(): boolean { return this._units !== undefined && this._units.length > 0; }\n public get customProps(): any { return this._customProps; }\n\n public static isFormatTraitSetInProps(formatProps: FormatProps, trait: FormatTraits) {\n if (!formatProps.formatTraits)\n return false;\n const formatTraits = Array.isArray(formatProps.formatTraits) ? formatProps.formatTraits : formatProps.formatTraits.split(/,|;|\\|/);\n const traitStr = getTraitString(trait);\n return formatTraits.find((traitEntry) => traitStr === traitEntry) ? true : false;\n }\n\n private async createUnit(unitsProvider: UnitsProvider, name: string, label?: string): Promise<void> {\n if (name === undefined || typeof (name) !== \"string\" || (label !== undefined && typeof (label) !== \"string\")) // throws if name is undefined or name isn't a string or if label is defined and isn't a string\n throw new QuantityError(QuantityStatus.InvalidJson, `This Composite has a unit with an invalid 'name' or 'label' attribute.`);\n for (const unit of this.units!) {\n const unitObj = unit[0].name;\n if (unitObj.toLowerCase() === name.toLowerCase()) // duplicate names are not allowed\n throw new QuantityError(QuantityStatus.InvalidJson, `The unit ${unitObj} has a duplicate name.`);\n }\n const newUnit: UnitProps = await unitsProvider.findUnitByName(name);\n if (!newUnit || !newUnit.isValid)\n throw new QuantityError(QuantityStatus.InvalidJson, `Invalid unit name '${name}'.`);\n this.units!.push([newUnit, label]);\n }\n\n /**\n * Clone Format\n */\n public clone(options?: CloneOptions): Format {\n const newFormat = new Format(this.name);\n newFormat._roundFactor = this._roundFactor;\n newFormat._type = this._type;\n newFormat._precision = this._precision;\n newFormat._minWidth = this._minWidth;\n newFormat._scientificType = this._scientificType;\n newFormat._showSignOption = this._showSignOption;\n newFormat._decimalSeparator = this._decimalSeparator;\n newFormat._thousandSeparator = this._thousandSeparator;\n newFormat._uomSeparator = this._uomSeparator;\n newFormat._stationSeparator = this._stationSeparator;\n newFormat._stationOffsetSize = this._stationOffsetSize;\n newFormat._stationBaseFactor = this._stationBaseFactor;\n newFormat._formatTraits = this._formatTraits;\n newFormat._spacer = this._spacer;\n newFormat._includeZero = this._includeZero;\n newFormat._azimuthBase = this._azimuthBase;\n newFormat._azimuthBaseUnit = this._azimuthBaseUnit;\n newFormat._azimuthCounterClockwise = this._azimuthCounterClockwise;\n newFormat._ratioType = this._ratioType;\n newFormat._revolutionUnit = this._revolutionUnit;\n newFormat._customProps = this._customProps;\n this._units && (newFormat._units = [...this._units]);\n\n if (newFormat._units) {\n if (options?.showOnlyPrimaryUnit) {\n if (newFormat._units.length > 1)\n newFormat._units.length = 1;\n }\n }\n\n if (undefined !== options?.traits)\n newFormat._formatTraits = options?.traits;\n\n if (undefined !== options?.type)\n newFormat._type = options.type;\n\n if (undefined !== options?.precision) {\n // ensure specified precision is valid\n const precision = parsePrecision(options?.precision, newFormat._type, newFormat.name);\n newFormat._precision = precision;\n }\n\n if (undefined !== options?.primaryUnit) {\n if (options.primaryUnit.unit) {\n const newUnits = new Array<[UnitProps, string | undefined]>();\n newUnits.push([options.primaryUnit.unit, options.primaryUnit.label]);\n newFormat._units = newUnits;\n } else if (options.primaryUnit.label && newFormat._units?.length) {\n // update label only\n newFormat._units[0][1] = options.primaryUnit.label;\n }\n }\n return newFormat;\n }\n\n /**\n * Populates this Format with the values from the provided.\n */\n public async fromJSON(unitsProvider: UnitsProvider, jsonObj: FormatProps): Promise<void> {\n this.loadFormatProperties(jsonObj);\n\n if (isCustomFormatProps(jsonObj))\n this._customProps = jsonObj.custom;\n\n if (undefined !== jsonObj.composite) { // optional\n this._units = new Array<[UnitProps, string | undefined]>();\n if (jsonObj.composite.includeZero !== undefined) {\n if (typeof (jsonObj.composite.includeZero) !== \"boolean\") // includeZero must be a boolean IF it is defined\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has a Composite with an invalid 'includeZero' attribute. It should be of type 'boolean'.`);\n this._includeZero = jsonObj.composite.includeZero;\n }\n if (jsonObj.composite.spacer !== undefined) { // spacer must be a string IF it is defined\n if (typeof (jsonObj.composite.spacer) !== \"string\")\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has a Composite with an invalid 'spacer' attribute. It must be of type 'string'.`);\n if (jsonObj.composite.spacer.length > 1)\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has a Composite with an invalid 'spacer' attribute. It should be an empty or one character string.`);\n this._spacer = jsonObj.composite.spacer;\n }\n if (jsonObj.composite.units !== undefined) { // if composite is defined, it must be an array with 1-4 units\n if (!Array.isArray(jsonObj.composite.units)) { // must be an array\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has a Composite with an invalid 'units' attribute. It must be of type 'array'`);\n }\n if (jsonObj.composite.units.length > 0 && jsonObj.composite.units.length <= 4) { // Composite requires 1-4 units\n try {\n const createUnitPromises: Array<Promise<void>> = [];\n for (const unit of jsonObj.composite.units) {\n createUnitPromises.push(this.createUnit(unitsProvider, unit.name, unit.label));\n }\n\n await Promise.all(createUnitPromises);\n } catch (e) {\n throw e;\n }\n }\n }\n if (undefined === this.units || this.units.length === 0)\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has a Composite with no valid 'units'`);\n }\n\n if(this.type === FormatType.Azimuth || this.type === FormatType.Bearing) {\n // these units cannot be loaded from loadFormatProperties() because they require an async call, and the method signature is already public\n\n if (undefined !== jsonObj.azimuthBaseUnit) {\n if (typeof (jsonObj.azimuthBaseUnit) !== \"string\")\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has an invalid 'azimuthBaseUnit' attribute. It should be of type 'string'.`);\n\n const baseUnit: UnitProps = await unitsProvider.findUnitByName(jsonObj.azimuthBaseUnit);\n if (!baseUnit || !baseUnit.isValid)\n throw new QuantityError(QuantityStatus.InvalidJson, `Invalid unit name '${jsonObj.azimuthBaseUnit}' for azimuthBaseUnit in Format '${this.name}'.`);\n\n this._azimuthBaseUnit = baseUnit;\n }\n\n if (undefined !== jsonObj.revolutionUnit) {\n if (typeof (jsonObj.revolutionUnit) !== \"string\")\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has an invalid 'revolutionUnit' attribute. It should be of type 'string'.`);\n\n const revolutionUnit: UnitProps = await unitsProvider.findUnitByName(jsonObj.revolutionUnit);\n if (!revolutionUnit || !revolutionUnit.isValid)\n throw new QuantityError(QuantityStatus.InvalidJson, `Invalid unit name '${jsonObj.revolutionUnit}' for revolutionUnit in Format '${this.name}'.`);\n\n this._revolutionUnit = revolutionUnit;\n }\n\n if (this._revolutionUnit === undefined)\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} is 'Azimuth' or 'Bearing' type therefore the attribute 'revolutionUnit' is required.`);\n if (this._azimuthBase !== undefined && this._azimuthBaseUnit === undefined)\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has an 'azimuthBase' attribute therefore the attribute 'azimuthBaseUnit' is required.`);\n }\n }\n\n /** Create a Format from FormatProps */\n public static async createFromJSON(name: string, unitsProvider: UnitsProvider, formatProps: FormatProps) {\n const actualFormat = new Format(name);\n await actualFormat.fromJSON(unitsProvider, formatProps);\n return actualFormat;\n }\n\n /**\n * Returns a JSON object that contain the specification for this Format.\n */\n public toJSON(): FormatProps {\n let composite;\n if (this.units) {\n const units = this.units.map((value) => {\n if (undefined !== value[1])\n return { name: value[0].name, label: value[1] };\n else\n return { name: value[0].name };\n });\n\n composite = {\n spacer: this.spacer,\n includeZero: this.includeZero,\n units,\n };\n }\n\n const azimuthBaseUnit = this.azimuthBaseUnit ? this.azimuthBaseUnit.name : undefined;\n const revolutionUnit = this.revolutionUnit ? this.revolutionUnit.name : undefined;\n\n const baseFormatProps: FormatProps = {\n type: this.type,\n precision: this.precision,\n roundFactor: this.roundFactor,\n minWidth: this.minWidth,\n showSignOption: this.showSignOption,\n formatTraits: formatTraitsToArray(this.formatTraits),\n decimalSeparator: this.decimalSeparator,\n thousandSeparator: this.thousandSeparator,\n uomSeparator: this.uomSeparator,\n scientificType: this.scientificType ? this.scientificType : undefined,\n ratioType: this.ratioType,\n stationOffsetSize: this.stationOffsetSize,\n stationSeparator: this.stationSeparator,\n stationBaseFactor: this.stationBaseFactor,\n azimuthBase: this.azimuthBase,\n azimuthBaseUnit,\n azimuthCounterClockwise: this.azimuthCounterClockwise,\n revolutionUnit,\n composite,\n };\n\n if (this.customProps)\n return {\n ...baseFormatProps,\n custom: this.customProps,\n } as CustomFormatProps;\n\n return baseFormatProps;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"Format.js","sourceRoot":"","sources":["../../../src/Formatter/Format.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n * See LICENSE.md in the project root for license terms and full copyright notice.\r\n *--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Quantity\r\n */\r\n\r\nimport { QuantityConstants } from \"../Constants\";\r\nimport { QuantityError, QuantityStatus } from \"../Exception\";\r\nimport { UnitProps, UnitsProvider } from \"../Interfaces\";\r\nimport {\r\n DecimalPrecision, FormatTraits, formatTraitsToArray, FormatType, FractionalPrecision,\r\n getTraitString, parseFormatTrait, parseFormatType, parsePrecision, parseRatioType, parseScientificType, parseShowSignOption,\r\n RatioType, ScientificType,\r\n ShowSignOption,\r\n} from \"./FormatEnums\";\r\nimport { CloneOptions, CustomFormatProps, FormatProps, isCustomFormatProps } from \"./Interfaces\";\r\n\r\n// cSpell:ignore ZERONORMALIZED, nosign, onlynegative, signalways, negativeparentheses\r\n// cSpell:ignore trailzeroes, keepsinglezero, zeroempty, keepdecimalpoint, applyrounding, fractiondash, showunitlabel, prependunitlabel, exponentonlynegative\r\n\r\n/** A base Format class with shared properties and functionality between quantity and ecschema-metadata Format classes\r\n * @beta\r\n */\r\nexport class BaseFormat {\r\n private _name = \"\";\r\n protected _roundFactor: number = 0.0;\r\n protected _type: FormatType = FormatType.Decimal; // required; options are decimal, fractional, scientific, station\r\n protected _precision: number = DecimalPrecision.Six; // required\r\n protected _showSignOption: ShowSignOption = ShowSignOption.OnlyNegative; // options: noSign, onlyNegative, signAlways, negativeParentheses\r\n protected _decimalSeparator: string = QuantityConstants.LocaleSpecificDecimalSeparator;\r\n protected _thousandSeparator: string = QuantityConstants.LocaleSpecificThousandSeparator;\r\n protected _uomSeparator = \" \"; // optional; default is \" \"; defined separator between magnitude and the unit\r\n protected _stationSeparator = \"+\"; // optional; default is \"+\"\r\n protected _formatTraits: FormatTraits = FormatTraits.Uninitialized;\r\n protected _spacer: string = \" \"; // optional; default is \" \"\r\n protected _includeZero: boolean = true; // optional; default is true\r\n protected _minWidth?: number; // optional; positive int\r\n protected _scientificType?: ScientificType; // required if type is scientific; options: normalized, zeroNormalized\r\n protected _stationOffsetSize?: number; // required when type is station; positive integer > 0\r\n protected _stationBaseFactor?: number; // optional positive integer base factor for station formatting; default is 1\r\n protected _ratioType?: RatioType; // required if type is ratio; options: oneToN, NToOne, ValueBased, useGreatestCommonDivisor\r\n protected _azimuthBase?: number; // value always clockwise from north\r\n protected _azimuthBaseUnit?: UnitProps; // unit for azimuthBase value\r\n protected _azimuthCounterClockwise?: boolean; // if set to true, azimuth values are returned counter-clockwise from base\r\n protected _revolutionUnit?: UnitProps; // unit that represents a revolution, required for bearing or azimuth types\r\n protected _allowMathematicOperations: boolean = false; // optional; enables calculating mathematic operations like addition and subtraction; default is false.\r\n\r\n constructor(name: string) {\r\n this._name = name;\r\n }\r\n\r\n public get name(): string { return this._name; }\r\n\r\n public get roundFactor(): number { return this._roundFactor; }\r\n public set roundFactor(roundFactor: number) { this._roundFactor = roundFactor; }\r\n\r\n public get type(): FormatType { return this._type; }\r\n public set type(formatType: FormatType) { this._type = formatType; }\r\n\r\n public get precision(): DecimalPrecision | FractionalPrecision { return this._precision; }\r\n public set precision(precision: DecimalPrecision | FractionalPrecision) { this._precision = precision; }\r\n\r\n public get minWidth(): number | undefined { return this._minWidth; }\r\n public set minWidth(minWidth: number | undefined) { this._minWidth = minWidth; }\r\n\r\n public get scientificType(): ScientificType | undefined { return this._scientificType; }\r\n public set scientificType(scientificType: ScientificType | undefined) { this._scientificType = scientificType; }\r\n\r\n public get ratioType(): RatioType | undefined { return this._ratioType; }\r\n public set ratioType(ratioType: RatioType | undefined) { this._ratioType = ratioType; }\r\n\r\n public get showSignOption(): ShowSignOption { return this._showSignOption; }\r\n public set showSignOption(showSignOption: ShowSignOption) { this._showSignOption = showSignOption; }\r\n\r\n public get decimalSeparator(): string { return this._decimalSeparator; }\r\n public set decimalSeparator(decimalSeparator: string) { this._decimalSeparator = decimalSeparator; }\r\n\r\n public get thousandSeparator(): string { return this._thousandSeparator; }\r\n public set thousandSeparator(thousandSeparator: string) { this._thousandSeparator = thousandSeparator; }\r\n\r\n public get uomSeparator(): string { return this._uomSeparator; }\r\n public set uomSeparator(uomSeparator: string) { this._uomSeparator = uomSeparator; }\r\n\r\n public get stationSeparator(): string { return this._stationSeparator; }\r\n public set stationSeparator(stationSeparator: string) { this._stationSeparator = stationSeparator; }\r\n\r\n public get stationOffsetSize(): number | undefined { return this._stationOffsetSize; }\r\n public set stationOffsetSize(stationOffsetSize: number | undefined) { stationOffsetSize = this._stationOffsetSize = stationOffsetSize; }\r\n\r\n /** Gets the station base factor used for station formatting. This is a positive integer that acts as a multiplier\r\n * for the base offset calculation. The default value is 1.\r\n */\r\n public get stationBaseFactor(): number | undefined {\r\n return this._stationBaseFactor;\r\n }\r\n public set stationBaseFactor(stationBaseFactor: number | undefined) {\r\n this._stationBaseFactor = stationBaseFactor;\r\n }\r\n\r\n public get allowMathematicOperations(): boolean { return this._allowMathematicOperations; }\r\n public set allowMathematicOperations(allowMathematicOperations: boolean) { this._allowMathematicOperations = allowMathematicOperations; }\r\n\r\n public get formatTraits(): FormatTraits { return this._formatTraits; }\r\n public set formatTraits(formatTraits: FormatTraits) { this._formatTraits = formatTraits; }\r\n\r\n public get spacer(): string | undefined { return this._spacer; }\r\n public set spacer(spacer: string | undefined) { this._spacer = spacer ?? this._spacer; }\r\n public get spacerOrDefault(): string { return this._spacer ?? \" \"; }\r\n\r\n public get includeZero(): boolean | undefined { return this._includeZero; }\r\n public set includeZero(includeZero: boolean | undefined) { this._includeZero = includeZero ?? this._includeZero; }\r\n\r\n // default \"north\" is applied by the formatter (quarter rotation counter clockwise from east, the value depends on the units used)\r\n public get azimuthBase(): number | undefined { return this._azimuthBase; }\r\n public set azimuthBase(azimuthBase: number | undefined) { this._azimuthBase = azimuthBase; }\r\n\r\n public get azimuthBaseUnit(): UnitProps | undefined { return this._azimuthBaseUnit; }\r\n public set azimuthBaseUnit(azimuthBaseUnit: UnitProps | undefined) { this._azimuthBaseUnit = azimuthBaseUnit; }\r\n\r\n public get azimuthCounterClockwise(): boolean | undefined { return this._azimuthCounterClockwise; }\r\n public set azimuthCounterClockwise(azimuthCounterClockwise: boolean | undefined) { this._azimuthCounterClockwise = azimuthCounterClockwise; }\r\n public get azimuthClockwiseOrDefault(): boolean { return !this._azimuthCounterClockwise; }\r\n\r\n public get revolutionUnit(): UnitProps | undefined { return this._revolutionUnit; }\r\n public set revolutionUnit(revolutionUnit: UnitProps | undefined) { this._revolutionUnit = revolutionUnit; }\r\n\r\n /** This method parses input string that is typically extracted for persisted JSON data and validates that the string is a valid FormatType. Throws exception if not valid. */\r\n public parseFormatTraits(formatTraitsFromJson: string | string[]) {\r\n const formatTraits = (Array.isArray(formatTraitsFromJson)) ? formatTraitsFromJson : formatTraitsFromJson.split(/,|;|\\|/);\r\n formatTraits.forEach((formatTraitsString: string) => { // for each element in the string array\r\n const formatTrait = parseFormatTrait(formatTraitsString, this.name);\r\n this._formatTraits = this.formatTraits | formatTrait;\r\n });\r\n }\r\n\r\n /** This method returns true if the formatTrait is set in this Format object. */\r\n public hasFormatTraitSet(formatTrait: FormatTraits): boolean {\r\n return (this._formatTraits & formatTrait) === formatTrait;\r\n }\r\n\r\n public loadFormatProperties(formatProps: FormatProps) {\r\n this._type = parseFormatType(formatProps.type, this.name);\r\n\r\n if (formatProps.precision !== undefined) {\r\n if (!Number.isInteger(formatProps.precision)) // mut be an integer\r\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has an invalid 'precision' attribute. It should be an integer.`);\r\n\r\n this._precision = parsePrecision(formatProps.precision, this._type, this.name);\r\n }\r\n if (this.type === FormatType.Scientific) {\r\n if (undefined === formatProps.scientificType) // if format type is scientific and scientific type is undefined, throw\r\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} is 'Scientific' type therefore the attribute 'scientificType' is required.`);\r\n\r\n this._scientificType = parseScientificType(formatProps.scientificType, this.name);\r\n }\r\n\r\n if (this.type === FormatType.Ratio){\r\n if (undefined === formatProps.ratioType)\r\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} is 'Ratio' type therefore the attribute 'ratioType' is required.`);\r\n\r\n this._ratioType = parseRatioType(formatProps.ratioType, this.name);\r\n }\r\n\r\n if (undefined !== formatProps.roundFactor) { // optional; default is 0.0\r\n if (typeof (formatProps.roundFactor) !== \"number\")\r\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has an invalid 'roundFactor' attribute. It should be of type 'number'.`);\r\n if (formatProps.roundFactor !== this.roundFactor) // if roundFactor isn't default value of 0.0, reassign roundFactor variable\r\n this._roundFactor = formatProps.roundFactor;\r\n }\r\n\r\n if (undefined !== formatProps.minWidth) { // optional\r\n if (!Number.isInteger(formatProps.minWidth) || formatProps.minWidth < 0) // must be a positive int\r\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has an invalid 'minWidth' attribute. It should be a positive integer.`);\r\n this._minWidth = formatProps.minWidth;\r\n }\r\n if (FormatType.Station === this.type) {\r\n if (undefined === formatProps.stationOffsetSize)\r\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} is 'Station' type therefore the attribute 'stationOffsetSize' is required.`);\r\n if (!Number.isInteger(formatProps.stationOffsetSize) || formatProps.stationOffsetSize <= 0) // must be a positive int > 0\r\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has an invalid 'stationOffsetSize' attribute. It should be a positive integer.`);\r\n this._stationOffsetSize = formatProps.stationOffsetSize;\r\n\r\n if (undefined !== formatProps.stationBaseFactor) {\r\n // optional - must be a positive integer\r\n if (!Number.isInteger(formatProps.stationBaseFactor) || formatProps.stationBaseFactor <= 0)\r\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has an invalid 'stationBaseFactor' attribute. It should be a positive integer.`);\r\n this._stationBaseFactor = formatProps.stationBaseFactor;\r\n }\r\n }\r\n\r\n if (undefined !== formatProps.showSignOption) { // optional; default is \"onlyNegative\"\r\n this._showSignOption = parseShowSignOption(formatProps.showSignOption, this.name);\r\n }\r\n\r\n if (undefined !== formatProps.formatTraits && formatProps.formatTraits.length !== 0) { // FormatTraits is optional\r\n if (!Array.isArray(formatProps.formatTraits) && typeof (formatProps.formatTraits) !== \"string\") // must be either an array of strings or a string\r\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has an invalid 'formatTraits' attribute. It should be of type 'string' or 'string[]'.`);\r\n this.parseFormatTraits(formatProps.formatTraits); // check that all of the options for formatTraits are valid. If now, throw\r\n }\r\n\r\n if (undefined !== formatProps.decimalSeparator) { // optional\r\n if (typeof (formatProps.decimalSeparator) !== \"string\") // not a string or not a one character string\r\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has an invalid 'decimalSeparator' attribute. It should be of type 'string'.`);\r\n if (formatProps.decimalSeparator.length > 1)\r\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has an invalid 'decimalSeparator' attribute. It should be an empty or one character string.`);\r\n this._decimalSeparator = formatProps.decimalSeparator;\r\n }\r\n\r\n if (undefined !== formatProps.thousandSeparator) { // optional\r\n if (typeof (formatProps.thousandSeparator) !== \"string\")\r\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has an invalid 'thousandSeparator' attribute. It should be of type 'string'.`);\r\n if (formatProps.thousandSeparator.length > 1)\r\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has an invalid 'thousandSeparator' attribute. It should be an empty or one character string.`);\r\n this._thousandSeparator = formatProps.thousandSeparator;\r\n }\r\n\r\n if (undefined !== formatProps.uomSeparator) { // optional; default is \" \"\r\n if (typeof (formatProps.uomSeparator) !== \"string\")\r\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has an invalid 'uomSeparator' attribute. It should be of type 'string'.`);\r\n if (formatProps.uomSeparator.length < 0 || formatProps.uomSeparator.length > 1)\r\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has an invalid 'uomSeparator' attribute. It should be an empty or one character string.`);\r\n this._uomSeparator = formatProps.uomSeparator;\r\n }\r\n\r\n if (undefined !== formatProps.stationSeparator) { // optional; default is \"+\"\r\n if (typeof (formatProps.stationSeparator) !== \"string\")\r\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has an invalid 'stationSeparator' attribute. It should be of type 'string'.`);\r\n if (formatProps.stationSeparator.length > 1)\r\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has an invalid 'stationSeparator' attribute. It should be an empty or one character string.`);\r\n this._stationSeparator = formatProps.stationSeparator;\r\n }\r\n\r\n if (undefined !== formatProps.azimuthBase) { // optional; default is a quarter rotation (90 degrees) which represents north\r\n if (typeof (formatProps.azimuthBase) !== \"number\")\r\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has an invalid 'azimuthBase' attribute. It should be of type 'number'.`);\r\n this._azimuthBase = formatProps.azimuthBase;\r\n }\r\n\r\n if (undefined !== formatProps.azimuthCounterClockwise) { // optional; default is false\r\n if (typeof (formatProps.azimuthCounterClockwise) !== \"boolean\")\r\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has an invalid 'azimuthCounterClockwise' attribute. It should be of type 'boolean'.`);\r\n this._azimuthCounterClockwise = formatProps.azimuthCounterClockwise;\r\n }\r\n if (undefined !== formatProps.allowMathematicOperations) { // optional; default is false\r\n if (typeof (formatProps.allowMathematicOperations) !== \"boolean\")\r\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has an invalid 'allowMathematicOperations' attribute. It should be of type 'boolean'.`);\r\n this._allowMathematicOperations = formatProps.allowMathematicOperations;\r\n }\r\n }\r\n}\r\n\r\n/** A class used to define the specifications for formatting quantity values. This class is typically loaded by reading [[FormatProps]].\r\n * @beta\r\n */\r\nexport class Format extends BaseFormat {\r\n protected _units?: Array<[UnitProps, string | undefined]>;\r\n protected _customProps?: any; // used by custom formatters and parsers\r\n\r\n /** Constructor\r\n * @param name The name of a format specification. TODO: make optional or remove\r\n */\r\n constructor(name: string) {\r\n super(name);\r\n }\r\n\r\n public get units(): Array<[UnitProps, string | undefined]> | undefined { return this._units; }\r\n public get hasUnits(): boolean { return this._units !== undefined && this._units.length > 0; }\r\n public get customProps(): any { return this._customProps; }\r\n\r\n public static isFormatTraitSetInProps(formatProps: FormatProps, trait: FormatTraits) {\r\n if (!formatProps.formatTraits)\r\n return false;\r\n const formatTraits = Array.isArray(formatProps.formatTraits) ? formatProps.formatTraits : formatProps.formatTraits.split(/,|;|\\|/);\r\n const traitStr = getTraitString(trait);\r\n return formatTraits.find((traitEntry) => traitStr === traitEntry) ? true : false;\r\n }\r\n\r\n private async createUnit(unitsProvider: UnitsProvider, name: string, label?: string): Promise<void> {\r\n if (name === undefined || typeof (name) !== \"string\" || (label !== undefined && typeof (label) !== \"string\")) // throws if name is undefined or name isn't a string or if label is defined and isn't a string\r\n throw new QuantityError(QuantityStatus.InvalidJson, `This Composite has a unit with an invalid 'name' or 'label' attribute.`);\r\n for (const unit of this.units!) {\r\n const unitObj = unit[0].name;\r\n if (unitObj.toLowerCase() === name.toLowerCase()) // duplicate names are not allowed\r\n throw new QuantityError(QuantityStatus.InvalidJson, `The unit ${unitObj} has a duplicate name.`);\r\n }\r\n const newUnit: UnitProps = await unitsProvider.findUnitByName(name);\r\n if (!newUnit || !newUnit.isValid)\r\n throw new QuantityError(QuantityStatus.InvalidJson, `Invalid unit name '${name}'.`);\r\n this.units!.push([newUnit, label]);\r\n }\r\n\r\n /**\r\n * Clone Format\r\n */\r\n public clone(options?: CloneOptions): Format {\r\n const newFormat = new Format(this.name);\r\n newFormat._roundFactor = this._roundFactor;\r\n newFormat._type = this._type;\r\n newFormat._precision = this._precision;\r\n newFormat._minWidth = this._minWidth;\r\n newFormat._scientificType = this._scientificType;\r\n newFormat._showSignOption = this._showSignOption;\r\n newFormat._decimalSeparator = this._decimalSeparator;\r\n newFormat._thousandSeparator = this._thousandSeparator;\r\n newFormat._uomSeparator = this._uomSeparator;\r\n newFormat._stationSeparator = this._stationSeparator;\r\n newFormat._stationOffsetSize = this._stationOffsetSize;\r\n newFormat._stationBaseFactor = this._stationBaseFactor;\r\n newFormat._formatTraits = this._formatTraits;\r\n newFormat._spacer = this._spacer;\r\n newFormat._includeZero = this._includeZero;\r\n newFormat._azimuthBase = this._azimuthBase;\r\n newFormat._azimuthBaseUnit = this._azimuthBaseUnit;\r\n newFormat._azimuthCounterClockwise = this._azimuthCounterClockwise;\r\n newFormat._ratioType = this._ratioType;\r\n newFormat._revolutionUnit = this._revolutionUnit;\r\n newFormat._customProps = this._customProps;\r\n this._units && (newFormat._units = [...this._units]);\r\n\r\n if (newFormat._units) {\r\n if (options?.showOnlyPrimaryUnit) {\r\n if (newFormat._units.length > 1)\r\n newFormat._units.length = 1;\r\n }\r\n }\r\n\r\n if (undefined !== options?.traits)\r\n newFormat._formatTraits = options?.traits;\r\n\r\n if (undefined !== options?.type)\r\n newFormat._type = options.type;\r\n\r\n if (undefined !== options?.precision) {\r\n // ensure specified precision is valid\r\n const precision = parsePrecision(options?.precision, newFormat._type, newFormat.name);\r\n newFormat._precision = precision;\r\n }\r\n\r\n if (undefined !== options?.primaryUnit) {\r\n if (options.primaryUnit.unit) {\r\n const newUnits = new Array<[UnitProps, string | undefined]>();\r\n newUnits.push([options.primaryUnit.unit, options.primaryUnit.label]);\r\n newFormat._units = newUnits;\r\n } else if (options.primaryUnit.label && newFormat._units?.length) {\r\n // update label only\r\n newFormat._units[0][1] = options.primaryUnit.label;\r\n }\r\n }\r\n return newFormat;\r\n }\r\n\r\n /**\r\n * Populates this Format with the values from the provided.\r\n */\r\n public async fromJSON(unitsProvider: UnitsProvider, jsonObj: FormatProps): Promise<void> {\r\n this.loadFormatProperties(jsonObj);\r\n\r\n if (isCustomFormatProps(jsonObj))\r\n this._customProps = jsonObj.custom;\r\n\r\n if (undefined !== jsonObj.composite) { // optional\r\n this._units = new Array<[UnitProps, string | undefined]>();\r\n if (jsonObj.composite.includeZero !== undefined) {\r\n if (typeof (jsonObj.composite.includeZero) !== \"boolean\") // includeZero must be a boolean IF it is defined\r\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has a Composite with an invalid 'includeZero' attribute. It should be of type 'boolean'.`);\r\n this._includeZero = jsonObj.composite.includeZero;\r\n }\r\n if (jsonObj.composite.spacer !== undefined) { // spacer must be a string IF it is defined\r\n if (typeof (jsonObj.composite.spacer) !== \"string\")\r\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has a Composite with an invalid 'spacer' attribute. It must be of type 'string'.`);\r\n if (jsonObj.composite.spacer.length > 1)\r\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has a Composite with an invalid 'spacer' attribute. It should be an empty or one character string.`);\r\n this._spacer = jsonObj.composite.spacer;\r\n }\r\n if (jsonObj.composite.units !== undefined) { // if composite is defined, it must be an array with 1-4 units\r\n if (!Array.isArray(jsonObj.composite.units)) { // must be an array\r\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has a Composite with an invalid 'units' attribute. It must be of type 'array'`);\r\n }\r\n if (jsonObj.composite.units.length > 0 && jsonObj.composite.units.length <= 4) { // Composite requires 1-4 units\r\n try {\r\n const createUnitPromises: Array<Promise<void>> = [];\r\n for (const unit of jsonObj.composite.units) {\r\n createUnitPromises.push(this.createUnit(unitsProvider, unit.name, unit.label));\r\n }\r\n\r\n await Promise.all(createUnitPromises);\r\n } catch (e) {\r\n throw e;\r\n }\r\n }\r\n }\r\n if (undefined === this.units || this.units.length === 0)\r\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has a Composite with no valid 'units'`);\r\n }\r\n\r\n if(this.type === FormatType.Azimuth || this.type === FormatType.Bearing) {\r\n // these units cannot be loaded from loadFormatProperties() because they require an async call, and the method signature is already public\r\n\r\n if (undefined !== jsonObj.azimuthBaseUnit) {\r\n if (typeof (jsonObj.azimuthBaseUnit) !== \"string\")\r\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has an invalid 'azimuthBaseUnit' attribute. It should be of type 'string'.`);\r\n\r\n const baseUnit: UnitProps = await unitsProvider.findUnitByName(jsonObj.azimuthBaseUnit);\r\n if (!baseUnit || !baseUnit.isValid)\r\n throw new QuantityError(QuantityStatus.InvalidJson, `Invalid unit name '${jsonObj.azimuthBaseUnit}' for azimuthBaseUnit in Format '${this.name}'.`);\r\n\r\n this._azimuthBaseUnit = baseUnit;\r\n }\r\n\r\n if (undefined !== jsonObj.revolutionUnit) {\r\n if (typeof (jsonObj.revolutionUnit) !== \"string\")\r\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has an invalid 'revolutionUnit' attribute. It should be of type 'string'.`);\r\n\r\n const revolutionUnit: UnitProps = await unitsProvider.findUnitByName(jsonObj.revolutionUnit);\r\n if (!revolutionUnit || !revolutionUnit.isValid)\r\n throw new QuantityError(QuantityStatus.InvalidJson, `Invalid unit name '${jsonObj.revolutionUnit}' for revolutionUnit in Format '${this.name}'.`);\r\n\r\n this._revolutionUnit = revolutionUnit;\r\n }\r\n\r\n if (this._revolutionUnit === undefined)\r\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} is 'Azimuth' or 'Bearing' type therefore the attribute 'revolutionUnit' is required.`);\r\n if (this._azimuthBase !== undefined && this._azimuthBaseUnit === undefined)\r\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${this.name} has an 'azimuthBase' attribute therefore the attribute 'azimuthBaseUnit' is required.`);\r\n }\r\n }\r\n\r\n /** Create a Format from FormatProps */\r\n public static async createFromJSON(name: string, unitsProvider: UnitsProvider, formatProps: FormatProps) {\r\n const actualFormat = new Format(name);\r\n await actualFormat.fromJSON(unitsProvider, formatProps);\r\n return actualFormat;\r\n }\r\n\r\n /**\r\n * Returns a JSON object that contain the specification for this Format.\r\n */\r\n public toJSON(): FormatProps {\r\n let composite;\r\n if (this.units) {\r\n const units = this.units.map((value) => {\r\n if (undefined !== value[1])\r\n return { name: value[0].name, label: value[1] };\r\n else\r\n return { name: value[0].name };\r\n });\r\n\r\n composite = {\r\n spacer: this.spacer,\r\n includeZero: this.includeZero,\r\n units,\r\n };\r\n }\r\n\r\n const azimuthBaseUnit = this.azimuthBaseUnit ? this.azimuthBaseUnit.name : undefined;\r\n const revolutionUnit = this.revolutionUnit ? this.revolutionUnit.name : undefined;\r\n\r\n const baseFormatProps: FormatProps = {\r\n type: this.type,\r\n precision: this.precision,\r\n roundFactor: this.roundFactor,\r\n minWidth: this.minWidth,\r\n showSignOption: this.showSignOption,\r\n formatTraits: formatTraitsToArray(this.formatTraits),\r\n decimalSeparator: this.decimalSeparator,\r\n thousandSeparator: this.thousandSeparator,\r\n uomSeparator: this.uomSeparator,\r\n scientificType: this.scientificType ? this.scientificType : undefined,\r\n ratioType: this.ratioType,\r\n stationOffsetSize: this.stationOffsetSize,\r\n stationSeparator: this.stationSeparator,\r\n stationBaseFactor: this.stationBaseFactor,\r\n azimuthBase: this.azimuthBase,\r\n azimuthBaseUnit,\r\n azimuthCounterClockwise: this.azimuthCounterClockwise,\r\n revolutionUnit,\r\n composite,\r\n };\r\n\r\n if (this.customProps)\r\n return {\r\n ...baseFormatProps,\r\n custom: this.customProps,\r\n } as CustomFormatProps;\r\n\r\n return baseFormatProps;\r\n }\r\n}\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FormatEnums.js","sourceRoot":"","sources":["../../../src/Formatter/FormatEnums.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Quantity\n */\n\nimport { QuantityError, QuantityStatus } from \"../Exception\";\n\n/** The regular expression to parse [format strings]($docs/bis/ec/kindofquantity.md#format-string)\n * provided in serialized formats as well as the full name of an [[OverrideFormat]].\n *\n * `formatName(precision)[unitName|unitLabel][unitName|unitLabel][unitName|unitLabel][unitName|unitLabel]`\n *\n * Explanation of the regex:\n * - ([\\w.:]+)\n * - Grabs the format full name\n * - (\\(([^\\)]+)\\))?\n * - Grabs the precision part with and without the `()`.\n * - The parentheses are needed to validate the entire string. (TODO: Need to check if this is true)\n * - (\\[([^\\|\\]]+)([\\|])?([^\\]]+)?\\])?\n * - 4 of these make up the rest of the regex, none of them are required so each end in `?`\n * - Grabs the unit name and label including the `[]`\n * - Grabs the unit name, `|` and label separately\n * @internal\n */\nexport const formatStringRgx = /([\\w.:]+)(\\(([^\\)]+)\\))?(\\[([^\\|\\]]+)([\\|])?([^\\]]+)?\\])?(\\[([^\\|\\]]+)([\\|])?([^\\]]+)?\\])?(\\[([^\\|\\]]+)([\\|])?([^\\]]+)?\\])?(\\[([^\\|\\]]+)([\\|])?([^\\]]+)?\\])?/;\n\n/** @internal */\nexport function* getItemNamesFromFormatString(formatString: string): Iterable<string> {\n const match = formatString.split(formatStringRgx);\n yield match[1]; // the Format Name\n let index = 4;\n while (index < match.length - 1) { // index 0 and 21 are empty strings\n if (match[index] !== undefined)\n yield match[index + 1]; // Unit Name\n else\n break;\n index += 4;\n }\n}\n/** @beta */\nexport enum FormatTraits {\n Uninitialized = 0,\n /** Show trailing zeroes to requested precision. */\n TrailZeroes = 1 << 0,\n /** Indicates that the fractional part of the number is required when the fraction is zero */\n KeepSingleZero = 1 << 1,\n /** Zero magnitude returns blank display value */\n ZeroEmpty = 1 << 2,\n /** Show decimal point when value to right of decimal is empty */\n KeepDecimalPoint = 1 << 3,\n /** Use the rounding factor. Not yet supported */\n ApplyRounding = 1 << 4,\n /** Show a dash between whole value and fractional value */\n FractionDash = 1 << 5,\n /** Append the quantity's unit label */\n ShowUnitLabel = 1 << 6,\n /** Prepend unit label. Not yet supported */\n PrependUnitLabel = 1 << 7,\n /** show a grouping in each group of 1000. */\n Use1000Separator = 1 << 8,\n /** Indicates that if an exponent value is positive to not include a `+`. By default a sign, `+` or `-`, is always shown. Not yet supported */\n ExponentOnlyNegative = 1 << 9,\n}\n\n/** Precision for Fractional formatted value types. Range from Whole (1/1) through 1/256.\n * @beta */\nexport enum FractionalPrecision {\n One = 1,\n Two = 2,\n Four = 4,\n Eight = 8,\n Sixteen = 16,\n ThirtyTwo = 32,\n SixtyFour = 64,\n OneHundredTwentyEight = 128,\n TwoHundredFiftySix = 256,\n}\n\n/** Precision for Decimal, Scientific, and Station formatted value types. Range from 1/(10^0) through 1/(10^12).\n * @beta */\nexport enum DecimalPrecision {\n Zero = 0,\n One = 1,\n Two = 2,\n Three = 3,\n Four = 4,\n Five = 5,\n Six = 6,\n Seven = 7,\n Eight = 8,\n Nine = 9,\n Ten = 10,\n Eleven = 11,\n Twelve = 12,\n}\n\n/** Supported format types\n * @beta */\nexport enum FormatType {\n /** Decimal display (ie 2.125) */\n Decimal = \"Decimal\",\n /** Fractional display (ie 2-1/8) */\n Fractional = \"Fractional\",\n /** Scientific Notation (ie 1.04e3) */\n Scientific = \"Scientific\",\n /** Civil Engineering Stationing (ie 1+00). */\n Station = \"Station\",\n /** Bearing angle e.g. N05:00:00E. Requires provided quantities to be of the angle phenomenon */\n Bearing = \"Bearing\",\n /** Azimuth angle e.g. 45°30'00\". Requires provided quantities to be of the angle phenomenon */\n Azimuth = \"Azimuth\",\n /** Ratio display e,g. 1:2 or 0.3:1. */\n Ratio = \"Ratio\",\n}\n\n/** required if type is scientific\n * @beta */\nexport enum ScientificType {\n /** Non-zero value left of decimal point (ie 1.2345e3) */\n Normalized = \"Normalized\",\n /** Zero value left of decimal point (ie 0.12345e4) */\n ZeroNormalized = \"ZeroNormalized\",\n}\n\n/** required if type is ratio\n * @beta */\nexport enum RatioType {\n /** One to N ratio (ie 1:N) */\n OneToN = \"OneToN\",\n /** N to One ratio (ie N:1) */\n NToOne = \"NToOne\",\n /** the lesser value scales to 1. e.g. input 0.5 turns into 2:1 | input 2 turns into 1:2 */\n ValueBased = \"ValueBased\",\n /** scales the input ratio to its simplest integer form using the greatest common divisor (GCD) of the values. e.g. 0.3 turns into 3:10 */\n UseGreatestCommonDivisor = \"UseGreatestCommonDivisor\",\n}\n\n/** Determines how the sign of values are displayed\n * @beta */\nexport enum ShowSignOption {\n /** Never show a sign even if the value is negative. */\n NoSign = \"NoSign\",\n /** Only show a sign when the value is negative. */\n OnlyNegative = \"OnlyNegative\",\n /** Always show a sign whether the value is positive or negative. */\n SignAlways = \"SignAlways\",\n /** Only show a sign when the value is negative but use parentheses instead of a negative sign. For example, -10 is formatted as `(10)`. */\n NegativeParentheses = \"NegativeParentheses\",\n}\n\n// parse and toString methods\n\n/**\n * @beta\n * @deprecated in 4.10 - will not be removed until after 2026-06-13. ScientificType is now a string enum and doesn't need a serialization method. You can access the enum directly.\n*/\nexport function scientificTypeToString(scientificType: ScientificType): string {\n return (scientificType === ScientificType.Normalized) ? \"Normalized\" : \"ZeroNormalized\";\n}\n\n/**\n * @beta\n*/\nexport function parseScientificType(scientificType: string, formatName: string): ScientificType {\n switch (scientificType.toLowerCase()) {\n case \"normalized\": return ScientificType.Normalized;\n case \"zeronormalized\": return ScientificType.ZeroNormalized;\n default:\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${formatName} has an invalid 'scientificType' attribute.`);\n }\n}\n\n/** @beta */\nexport function parseRatioType(ratioType: string, formatName: string): RatioType {\n const normalizedValue = ratioType.toLowerCase();\n for (const key in RatioType) {\n if (RatioType.hasOwnProperty(key)) {\n const enumValue = RatioType[key as keyof typeof RatioType];\n if (enumValue.toLowerCase() === normalizedValue) {\n return enumValue as RatioType;\n }\n }\n }\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${formatName} has an invalid 'ratioType' attribute.`);\n}\n\n/** @beta */\nexport function parseShowSignOption(showSignOption: string, formatName: string): ShowSignOption {\n switch (showSignOption.toLowerCase()) {\n case \"nosign\": return ShowSignOption.NoSign;\n case \"onlynegative\": return ShowSignOption.OnlyNegative;\n case \"signalways\": return ShowSignOption.SignAlways;\n case \"negativeparentheses\": return ShowSignOption.NegativeParentheses;\n default:\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${formatName} has an invalid 'showSignOption' attribute.`);\n }\n}\n\n/**\n * @beta\n * @deprecated in 4.10 - will not be removed until after 2026-06-13. ShowSignOption is now a string enum and doesn't need a serialization method. You can access the enum directly.\n*/\nexport function showSignOptionToString(showSign: ShowSignOption): string {\n switch (showSign) {\n case ShowSignOption.NegativeParentheses: return \"NegativeParentheses\";\n case ShowSignOption.NoSign: return \"NoSign\";\n case ShowSignOption.OnlyNegative: return \"OnlyNegative\";\n case ShowSignOption.SignAlways: return \"SignAlways\";\n }\n}\n\n/** @beta */\nexport function parseFormatTrait(formatTraitsString: string, formatName: string): FormatTraits {\n switch (formatTraitsString.toLowerCase()) {\n case \"trailzeroes\": return FormatTraits.TrailZeroes;\n case \"keepsinglezero\": return FormatTraits.KeepSingleZero;\n case \"zeroempty\": return FormatTraits.ZeroEmpty;\n case \"keepdecimalpoint\": return FormatTraits.KeepDecimalPoint;\n case \"applyrounding\": return FormatTraits.ApplyRounding;\n case \"fractiondash\": return FormatTraits.FractionDash;\n case \"showunitlabel\": return FormatTraits.ShowUnitLabel;\n case \"prependunitlabel\": return FormatTraits.PrependUnitLabel;\n case \"use1000separator\": return FormatTraits.Use1000Separator;\n case \"exponentonlynegative\": return FormatTraits.ExponentOnlyNegative;\n default:\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${formatName} has an invalid 'formatTraits' attribute.`);\n }\n}\n\n/** @beta */\nexport function getTraitString(trait: FormatTraits) {\n switch (trait) {\n case FormatTraits.TrailZeroes:\n return \"trailZeroes\";\n case FormatTraits.KeepSingleZero:\n return \"keepSingleZero\";\n case FormatTraits.ZeroEmpty:\n return \"zeroEmpty\";\n case FormatTraits.KeepDecimalPoint:\n return \"keepDecimalPoint\";\n case FormatTraits.ApplyRounding:\n return \"applyRounding\";\n case FormatTraits.FractionDash:\n return \"fractionDash\";\n case FormatTraits.ShowUnitLabel:\n return \"showUnitLabel\";\n case FormatTraits.PrependUnitLabel:\n return \"prependUnitLabel\";\n case FormatTraits.Use1000Separator:\n return \"use1000Separator\";\n case FormatTraits.ExponentOnlyNegative:\n default:\n return \"exponentOnlyNegative\";\n }\n}\n\n/** @beta */\nexport function formatTraitsToArray(currentFormatTrait: FormatTraits): string[] {\n const formatTraitsArr = Array<string>();\n if ((currentFormatTrait & FormatTraits.TrailZeroes) === FormatTraits.TrailZeroes)\n formatTraitsArr.push(\"TrailZeroes\");\n if ((currentFormatTrait & FormatTraits.KeepSingleZero) === FormatTraits.KeepSingleZero)\n formatTraitsArr.push(\"KeepSingleZero\");\n if ((currentFormatTrait & FormatTraits.ZeroEmpty) === FormatTraits.ZeroEmpty)\n formatTraitsArr.push(\"ZeroEmpty\");\n if ((currentFormatTrait & FormatTraits.KeepDecimalPoint) === FormatTraits.KeepDecimalPoint)\n formatTraitsArr.push(\"KeepDecimalPoint\");\n if ((currentFormatTrait & FormatTraits.ApplyRounding) === FormatTraits.ApplyRounding)\n formatTraitsArr.push(\"ApplyRounding\");\n if ((currentFormatTrait & FormatTraits.FractionDash) === FormatTraits.FractionDash)\n formatTraitsArr.push(\"FractionDash\");\n if ((currentFormatTrait & FormatTraits.ShowUnitLabel) === FormatTraits.ShowUnitLabel)\n formatTraitsArr.push(\"ShowUnitLabel\");\n if ((currentFormatTrait & FormatTraits.PrependUnitLabel) === FormatTraits.PrependUnitLabel)\n formatTraitsArr.push(\"PrependUnitLabel\");\n if ((currentFormatTrait & FormatTraits.Use1000Separator) === FormatTraits.Use1000Separator)\n formatTraitsArr.push(\"Use1000Separator\");\n if ((currentFormatTrait & FormatTraits.ExponentOnlyNegative) === FormatTraits.ExponentOnlyNegative)\n formatTraitsArr.push(\"ExponentOnlyNegative\");\n return formatTraitsArr;\n}\n\n/** @beta */\nexport function parseFormatType(jsonObjType: string, formatName: string): FormatType {\n switch (jsonObjType.toLowerCase()) {\n case \"decimal\": return FormatType.Decimal;\n case \"scientific\": return FormatType.Scientific;\n case \"station\": return FormatType.Station;\n case \"fractional\": return FormatType.Fractional;\n case \"bearing\": return FormatType.Bearing;\n case \"azimuth\": return FormatType.Azimuth;\n case \"ratio\": return FormatType.Ratio;\n default:\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${formatName} has an invalid 'type' attribute.`);\n }\n}\n\n/** @beta\n * @deprecated in 4.10 - will not be removed until after 2026-06-13. FormatType is now a string enum and doesn't need a serialization method. You can access the enum directly.\n*/\nexport function formatTypeToString(type: FormatType): string {\n switch (type) {\n case FormatType.Decimal: return \"Decimal\";\n case FormatType.Scientific: return \"Scientific\";\n case FormatType.Station: return \"Station\";\n case FormatType.Fractional: return \"Fractional\";\n case FormatType.Bearing: return \"Bearing\";\n case FormatType.Azimuth: return \"Azimuth\";\n case FormatType.Ratio: return \"Ratio\";\n }\n}\n\n/** @beta */\nexport function parseDecimalPrecision(jsonObjPrecision: number, formatName: string): DecimalPrecision {\n switch (jsonObjPrecision) {\n case 0: return DecimalPrecision.Zero;\n case 1: return DecimalPrecision.One;\n case 2: return DecimalPrecision.Two;\n case 3: return DecimalPrecision.Three;\n case 4: return DecimalPrecision.Four;\n case 5: return DecimalPrecision.Five;\n case 6: return DecimalPrecision.Six;\n case 7: return DecimalPrecision.Seven;\n case 8: return DecimalPrecision.Eight;\n case 9: return DecimalPrecision.Nine;\n case 10: return DecimalPrecision.Ten;\n case 11: return DecimalPrecision.Eleven;\n case 12: return DecimalPrecision.Twelve;\n default:\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${formatName} has an invalid 'precision' attribute.`);\n }\n}\n\n/** @beta validates the input value, that is typically extracted for persisted JSON data, is a valid FractionalPrecision */\nexport function parseFractionalPrecision(jsonObjPrecision: number, formatName: string): FractionalPrecision {\n switch (jsonObjPrecision) {\n case 1: return FractionalPrecision.One;\n case 2: return FractionalPrecision.Two;\n case 4: return FractionalPrecision.Four;\n case 8: return FractionalPrecision.Eight;\n case 16: return FractionalPrecision.Sixteen;\n case 32: return FractionalPrecision.ThirtyTwo;\n case 64: return FractionalPrecision.SixtyFour;\n case 128: return FractionalPrecision.OneHundredTwentyEight;\n case 256: return FractionalPrecision.TwoHundredFiftySix;\n default:\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${formatName} has an invalid 'precision' attribute.`);\n }\n}\n\n/** @beta validates the input value, that is typically extracted for persisted JSON data, is a valid DecimalPrecision or FractionalPrecision. */\nexport function parsePrecision(precision: number, type: FormatType, formatName: string): DecimalPrecision | FractionalPrecision {\n switch (type) { // type must be decimal, fractional, scientific, or station\n case FormatType.Decimal:\n case FormatType.Scientific:\n case FormatType.Station:\n case FormatType.Ratio:\n case FormatType.Bearing:\n case FormatType.Azimuth:\n return parseDecimalPrecision(precision, formatName);\n case FormatType.Fractional:\n return parseFractionalPrecision(precision, formatName);\n default:\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${formatName} has an invalid 'precision' attribute.`);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"FormatEnums.js","sourceRoot":"","sources":["../../../src/Formatter/FormatEnums.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Quantity\r\n */\r\n\r\nimport { QuantityError, QuantityStatus } from \"../Exception\";\r\n\r\n/** The regular expression to parse [format strings]($docs/bis/ec/kindofquantity.md#format-string)\r\n * provided in serialized formats as well as the full name of an [[OverrideFormat]].\r\n *\r\n * `formatName(precision)[unitName|unitLabel][unitName|unitLabel][unitName|unitLabel][unitName|unitLabel]`\r\n *\r\n * Explanation of the regex:\r\n * - ([\\w.:]+)\r\n * - Grabs the format full name\r\n * - (\\(([^\\)]+)\\))?\r\n * - Grabs the precision part with and without the `()`.\r\n * - The parentheses are needed to validate the entire string. (TODO: Need to check if this is true)\r\n * - (\\[([^\\|\\]]+)([\\|])?([^\\]]+)?\\])?\r\n * - 4 of these make up the rest of the regex, none of them are required so each end in `?`\r\n * - Grabs the unit name and label including the `[]`\r\n * - Grabs the unit name, `|` and label separately\r\n * @internal\r\n */\r\nexport const formatStringRgx = /([\\w.:]+)(\\(([^\\)]+)\\))?(\\[([^\\|\\]]+)([\\|])?([^\\]]+)?\\])?(\\[([^\\|\\]]+)([\\|])?([^\\]]+)?\\])?(\\[([^\\|\\]]+)([\\|])?([^\\]]+)?\\])?(\\[([^\\|\\]]+)([\\|])?([^\\]]+)?\\])?/;\r\n\r\n/** @internal */\r\nexport function* getItemNamesFromFormatString(formatString: string): Iterable<string> {\r\n const match = formatString.split(formatStringRgx);\r\n yield match[1]; // the Format Name\r\n let index = 4;\r\n while (index < match.length - 1) { // index 0 and 21 are empty strings\r\n if (match[index] !== undefined)\r\n yield match[index + 1]; // Unit Name\r\n else\r\n break;\r\n index += 4;\r\n }\r\n}\r\n/** @beta */\r\nexport enum FormatTraits {\r\n Uninitialized = 0,\r\n /** Show trailing zeroes to requested precision. */\r\n TrailZeroes = 1 << 0,\r\n /** Indicates that the fractional part of the number is required when the fraction is zero */\r\n KeepSingleZero = 1 << 1,\r\n /** Zero magnitude returns blank display value */\r\n ZeroEmpty = 1 << 2,\r\n /** Show decimal point when value to right of decimal is empty */\r\n KeepDecimalPoint = 1 << 3,\r\n /** Use the rounding factor. Not yet supported */\r\n ApplyRounding = 1 << 4,\r\n /** Show a dash between whole value and fractional value */\r\n FractionDash = 1 << 5,\r\n /** Append the quantity's unit label */\r\n ShowUnitLabel = 1 << 6,\r\n /** Prepend unit label. Not yet supported */\r\n PrependUnitLabel = 1 << 7,\r\n /** show a grouping in each group of 1000. */\r\n Use1000Separator = 1 << 8,\r\n /** Indicates that if an exponent value is positive to not include a `+`. By default a sign, `+` or `-`, is always shown. Not yet supported */\r\n ExponentOnlyNegative = 1 << 9,\r\n}\r\n\r\n/** Precision for Fractional formatted value types. Range from Whole (1/1) through 1/256.\r\n * @beta */\r\nexport enum FractionalPrecision {\r\n One = 1,\r\n Two = 2,\r\n Four = 4,\r\n Eight = 8,\r\n Sixteen = 16,\r\n ThirtyTwo = 32,\r\n SixtyFour = 64,\r\n OneHundredTwentyEight = 128,\r\n TwoHundredFiftySix = 256,\r\n}\r\n\r\n/** Precision for Decimal, Scientific, and Station formatted value types. Range from 1/(10^0) through 1/(10^12).\r\n * @beta */\r\nexport enum DecimalPrecision {\r\n Zero = 0,\r\n One = 1,\r\n Two = 2,\r\n Three = 3,\r\n Four = 4,\r\n Five = 5,\r\n Six = 6,\r\n Seven = 7,\r\n Eight = 8,\r\n Nine = 9,\r\n Ten = 10,\r\n Eleven = 11,\r\n Twelve = 12,\r\n}\r\n\r\n/** Supported format types\r\n * @beta */\r\nexport enum FormatType {\r\n /** Decimal display (ie 2.125) */\r\n Decimal = \"Decimal\",\r\n /** Fractional display (ie 2-1/8) */\r\n Fractional = \"Fractional\",\r\n /** Scientific Notation (ie 1.04e3) */\r\n Scientific = \"Scientific\",\r\n /** Civil Engineering Stationing (ie 1+00). */\r\n Station = \"Station\",\r\n /** Bearing angle e.g. N05:00:00E. Requires provided quantities to be of the angle phenomenon */\r\n Bearing = \"Bearing\",\r\n /** Azimuth angle e.g. 45°30'00\". Requires provided quantities to be of the angle phenomenon */\r\n Azimuth = \"Azimuth\",\r\n /** Ratio display e,g. 1:2 or 0.3:1. */\r\n Ratio = \"Ratio\",\r\n}\r\n\r\n/** required if type is scientific\r\n * @beta */\r\nexport enum ScientificType {\r\n /** Non-zero value left of decimal point (ie 1.2345e3) */\r\n Normalized = \"Normalized\",\r\n /** Zero value left of decimal point (ie 0.12345e4) */\r\n ZeroNormalized = \"ZeroNormalized\",\r\n}\r\n\r\n/** required if type is ratio\r\n * @beta */\r\nexport enum RatioType {\r\n /** One to N ratio (ie 1:N) */\r\n OneToN = \"OneToN\",\r\n /** N to One ratio (ie N:1) */\r\n NToOne = \"NToOne\",\r\n /** the lesser value scales to 1. e.g. input 0.5 turns into 2:1 | input 2 turns into 1:2 */\r\n ValueBased = \"ValueBased\",\r\n /** scales the input ratio to its simplest integer form using the greatest common divisor (GCD) of the values. e.g. 0.3 turns into 3:10 */\r\n UseGreatestCommonDivisor = \"UseGreatestCommonDivisor\",\r\n}\r\n\r\n/** Determines how the sign of values are displayed\r\n * @beta */\r\nexport enum ShowSignOption {\r\n /** Never show a sign even if the value is negative. */\r\n NoSign = \"NoSign\",\r\n /** Only show a sign when the value is negative. */\r\n OnlyNegative = \"OnlyNegative\",\r\n /** Always show a sign whether the value is positive or negative. */\r\n SignAlways = \"SignAlways\",\r\n /** Only show a sign when the value is negative but use parentheses instead of a negative sign. For example, -10 is formatted as `(10)`. */\r\n NegativeParentheses = \"NegativeParentheses\",\r\n}\r\n\r\n// parse and toString methods\r\n\r\n/**\r\n * @beta\r\n * @deprecated in 4.10 - will not be removed until after 2026-06-13. ScientificType is now a string enum and doesn't need a serialization method. You can access the enum directly.\r\n*/\r\nexport function scientificTypeToString(scientificType: ScientificType): string {\r\n return (scientificType === ScientificType.Normalized) ? \"Normalized\" : \"ZeroNormalized\";\r\n}\r\n\r\n/**\r\n * @beta\r\n*/\r\nexport function parseScientificType(scientificType: string, formatName: string): ScientificType {\r\n switch (scientificType.toLowerCase()) {\r\n case \"normalized\": return ScientificType.Normalized;\r\n case \"zeronormalized\": return ScientificType.ZeroNormalized;\r\n default:\r\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${formatName} has an invalid 'scientificType' attribute.`);\r\n }\r\n}\r\n\r\n/** @beta */\r\nexport function parseRatioType(ratioType: string, formatName: string): RatioType {\r\n const normalizedValue = ratioType.toLowerCase();\r\n for (const key in RatioType) {\r\n if (RatioType.hasOwnProperty(key)) {\r\n const enumValue = RatioType[key as keyof typeof RatioType];\r\n if (enumValue.toLowerCase() === normalizedValue) {\r\n return enumValue as RatioType;\r\n }\r\n }\r\n }\r\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${formatName} has an invalid 'ratioType' attribute.`);\r\n}\r\n\r\n/** @beta */\r\nexport function parseShowSignOption(showSignOption: string, formatName: string): ShowSignOption {\r\n switch (showSignOption.toLowerCase()) {\r\n case \"nosign\": return ShowSignOption.NoSign;\r\n case \"onlynegative\": return ShowSignOption.OnlyNegative;\r\n case \"signalways\": return ShowSignOption.SignAlways;\r\n case \"negativeparentheses\": return ShowSignOption.NegativeParentheses;\r\n default:\r\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${formatName} has an invalid 'showSignOption' attribute.`);\r\n }\r\n}\r\n\r\n/**\r\n * @beta\r\n * @deprecated in 4.10 - will not be removed until after 2026-06-13. ShowSignOption is now a string enum and doesn't need a serialization method. You can access the enum directly.\r\n*/\r\nexport function showSignOptionToString(showSign: ShowSignOption): string {\r\n switch (showSign) {\r\n case ShowSignOption.NegativeParentheses: return \"NegativeParentheses\";\r\n case ShowSignOption.NoSign: return \"NoSign\";\r\n case ShowSignOption.OnlyNegative: return \"OnlyNegative\";\r\n case ShowSignOption.SignAlways: return \"SignAlways\";\r\n }\r\n}\r\n\r\n/** @beta */\r\nexport function parseFormatTrait(formatTraitsString: string, formatName: string): FormatTraits {\r\n switch (formatTraitsString.toLowerCase()) {\r\n case \"trailzeroes\": return FormatTraits.TrailZeroes;\r\n case \"keepsinglezero\": return FormatTraits.KeepSingleZero;\r\n case \"zeroempty\": return FormatTraits.ZeroEmpty;\r\n case \"keepdecimalpoint\": return FormatTraits.KeepDecimalPoint;\r\n case \"applyrounding\": return FormatTraits.ApplyRounding;\r\n case \"fractiondash\": return FormatTraits.FractionDash;\r\n case \"showunitlabel\": return FormatTraits.ShowUnitLabel;\r\n case \"prependunitlabel\": return FormatTraits.PrependUnitLabel;\r\n case \"use1000separator\": return FormatTraits.Use1000Separator;\r\n case \"exponentonlynegative\": return FormatTraits.ExponentOnlyNegative;\r\n default:\r\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${formatName} has an invalid 'formatTraits' attribute.`);\r\n }\r\n}\r\n\r\n/** @beta */\r\nexport function getTraitString(trait: FormatTraits) {\r\n switch (trait) {\r\n case FormatTraits.TrailZeroes:\r\n return \"trailZeroes\";\r\n case FormatTraits.KeepSingleZero:\r\n return \"keepSingleZero\";\r\n case FormatTraits.ZeroEmpty:\r\n return \"zeroEmpty\";\r\n case FormatTraits.KeepDecimalPoint:\r\n return \"keepDecimalPoint\";\r\n case FormatTraits.ApplyRounding:\r\n return \"applyRounding\";\r\n case FormatTraits.FractionDash:\r\n return \"fractionDash\";\r\n case FormatTraits.ShowUnitLabel:\r\n return \"showUnitLabel\";\r\n case FormatTraits.PrependUnitLabel:\r\n return \"prependUnitLabel\";\r\n case FormatTraits.Use1000Separator:\r\n return \"use1000Separator\";\r\n case FormatTraits.ExponentOnlyNegative:\r\n default:\r\n return \"exponentOnlyNegative\";\r\n }\r\n}\r\n\r\n/** @beta */\r\nexport function formatTraitsToArray(currentFormatTrait: FormatTraits): string[] {\r\n const formatTraitsArr = Array<string>();\r\n if ((currentFormatTrait & FormatTraits.TrailZeroes) === FormatTraits.TrailZeroes)\r\n formatTraitsArr.push(\"TrailZeroes\");\r\n if ((currentFormatTrait & FormatTraits.KeepSingleZero) === FormatTraits.KeepSingleZero)\r\n formatTraitsArr.push(\"KeepSingleZero\");\r\n if ((currentFormatTrait & FormatTraits.ZeroEmpty) === FormatTraits.ZeroEmpty)\r\n formatTraitsArr.push(\"ZeroEmpty\");\r\n if ((currentFormatTrait & FormatTraits.KeepDecimalPoint) === FormatTraits.KeepDecimalPoint)\r\n formatTraitsArr.push(\"KeepDecimalPoint\");\r\n if ((currentFormatTrait & FormatTraits.ApplyRounding) === FormatTraits.ApplyRounding)\r\n formatTraitsArr.push(\"ApplyRounding\");\r\n if ((currentFormatTrait & FormatTraits.FractionDash) === FormatTraits.FractionDash)\r\n formatTraitsArr.push(\"FractionDash\");\r\n if ((currentFormatTrait & FormatTraits.ShowUnitLabel) === FormatTraits.ShowUnitLabel)\r\n formatTraitsArr.push(\"ShowUnitLabel\");\r\n if ((currentFormatTrait & FormatTraits.PrependUnitLabel) === FormatTraits.PrependUnitLabel)\r\n formatTraitsArr.push(\"PrependUnitLabel\");\r\n if ((currentFormatTrait & FormatTraits.Use1000Separator) === FormatTraits.Use1000Separator)\r\n formatTraitsArr.push(\"Use1000Separator\");\r\n if ((currentFormatTrait & FormatTraits.ExponentOnlyNegative) === FormatTraits.ExponentOnlyNegative)\r\n formatTraitsArr.push(\"ExponentOnlyNegative\");\r\n return formatTraitsArr;\r\n}\r\n\r\n/** @beta */\r\nexport function parseFormatType(jsonObjType: string, formatName: string): FormatType {\r\n switch (jsonObjType.toLowerCase()) {\r\n case \"decimal\": return FormatType.Decimal;\r\n case \"scientific\": return FormatType.Scientific;\r\n case \"station\": return FormatType.Station;\r\n case \"fractional\": return FormatType.Fractional;\r\n case \"bearing\": return FormatType.Bearing;\r\n case \"azimuth\": return FormatType.Azimuth;\r\n case \"ratio\": return FormatType.Ratio;\r\n default:\r\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${formatName} has an invalid 'type' attribute.`);\r\n }\r\n}\r\n\r\n/** @beta\r\n * @deprecated in 4.10 - will not be removed until after 2026-06-13. FormatType is now a string enum and doesn't need a serialization method. You can access the enum directly.\r\n*/\r\nexport function formatTypeToString(type: FormatType): string {\r\n switch (type) {\r\n case FormatType.Decimal: return \"Decimal\";\r\n case FormatType.Scientific: return \"Scientific\";\r\n case FormatType.Station: return \"Station\";\r\n case FormatType.Fractional: return \"Fractional\";\r\n case FormatType.Bearing: return \"Bearing\";\r\n case FormatType.Azimuth: return \"Azimuth\";\r\n case FormatType.Ratio: return \"Ratio\";\r\n }\r\n}\r\n\r\n/** @beta */\r\nexport function parseDecimalPrecision(jsonObjPrecision: number, formatName: string): DecimalPrecision {\r\n switch (jsonObjPrecision) {\r\n case 0: return DecimalPrecision.Zero;\r\n case 1: return DecimalPrecision.One;\r\n case 2: return DecimalPrecision.Two;\r\n case 3: return DecimalPrecision.Three;\r\n case 4: return DecimalPrecision.Four;\r\n case 5: return DecimalPrecision.Five;\r\n case 6: return DecimalPrecision.Six;\r\n case 7: return DecimalPrecision.Seven;\r\n case 8: return DecimalPrecision.Eight;\r\n case 9: return DecimalPrecision.Nine;\r\n case 10: return DecimalPrecision.Ten;\r\n case 11: return DecimalPrecision.Eleven;\r\n case 12: return DecimalPrecision.Twelve;\r\n default:\r\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${formatName} has an invalid 'precision' attribute.`);\r\n }\r\n}\r\n\r\n/** @beta validates the input value, that is typically extracted for persisted JSON data, is a valid FractionalPrecision */\r\nexport function parseFractionalPrecision(jsonObjPrecision: number, formatName: string): FractionalPrecision {\r\n switch (jsonObjPrecision) {\r\n case 1: return FractionalPrecision.One;\r\n case 2: return FractionalPrecision.Two;\r\n case 4: return FractionalPrecision.Four;\r\n case 8: return FractionalPrecision.Eight;\r\n case 16: return FractionalPrecision.Sixteen;\r\n case 32: return FractionalPrecision.ThirtyTwo;\r\n case 64: return FractionalPrecision.SixtyFour;\r\n case 128: return FractionalPrecision.OneHundredTwentyEight;\r\n case 256: return FractionalPrecision.TwoHundredFiftySix;\r\n default:\r\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${formatName} has an invalid 'precision' attribute.`);\r\n }\r\n}\r\n\r\n/** @beta validates the input value, that is typically extracted for persisted JSON data, is a valid DecimalPrecision or FractionalPrecision. */\r\nexport function parsePrecision(precision: number, type: FormatType, formatName: string): DecimalPrecision | FractionalPrecision {\r\n switch (type) { // type must be decimal, fractional, scientific, or station\r\n case FormatType.Decimal:\r\n case FormatType.Scientific:\r\n case FormatType.Station:\r\n case FormatType.Ratio:\r\n case FormatType.Bearing:\r\n case FormatType.Azimuth:\r\n return parseDecimalPrecision(precision, formatName);\r\n case FormatType.Fractional:\r\n return parseFractionalPrecision(precision, formatName);\r\n default:\r\n throw new QuantityError(QuantityStatus.InvalidJson, `The Format ${formatName} has an invalid 'precision' attribute.`);\r\n }\r\n}\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Formatter.js","sourceRoot":"","sources":["../../../src/Formatter/Formatter.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Quantity\n */\n\nimport { QuantityConstants } from \"../Constants\";\nimport { QuantityError, QuantityStatus } from \"../Exception\";\nimport { FormatterSpec } from \"./FormatterSpec\";\nimport { DecimalPrecision, FormatTraits, FormatType, FractionalPrecision, RatioType, ScientificType, ShowSignOption } from \"./FormatEnums\";\nimport { applyConversion, Quantity } from \"../Quantity\";\n\n/** rounding additive\n * @internal\n */\nconst FPV_ROUNDFACTOR = 0.50000000001;\n\n/** A private helper class used to format fraction part of value into a numerator and denominator.\n * @internal\n */\nclass FractionalNumeric {\n private _integral: number = 0;\n private _numerator: number = 0;\n private _denominator: number = 1;\n private _greatestCommonFactor: number = 1;\n private _textParts: string[] = [];\n\n constructor(value: number, precision: FractionalPrecision, reduce: boolean) {\n this.calculate(value, precision as number);\n this.formTextParts(reduce);\n }\n\n private calculate(value: number, denominator: number) {\n const positiveValue = Math.abs(value);\n this._denominator = denominator;\n this._integral = Math.floor(positiveValue);\n const fractionPart = positiveValue - this._integral;\n this._numerator = Math.floor(fractionPart * this._denominator + FPV_ROUNDFACTOR);\n\n if (0 !== denominator && (this._numerator / this._denominator) === 1) {\n this._numerator = 0;\n this._integral += 1;\n } else {\n this._greatestCommonFactor = FractionalNumeric.getGreatestCommonFactor(this._numerator, this._denominator);\n }\n }\n\n /** Determine the GCD given two values. This value can be used to reduce a fraction.\n * See algorithm description http://en.wikipedia.org/wiki/Euclidean_algorithm\n */\n public static getGreatestCommonFactor(numerator: number, denominator: number): number {\n let r;\n while (denominator !== 0) {\n r = numerator % denominator;\n numerator = denominator;\n denominator = r;\n }\n return (numerator < 0) ? -numerator : numerator;\n }\n\n public get greatestCommonFactor(): number { return this._greatestCommonFactor; }\n public get hasFractionPart(): boolean { return this._textParts.length > 0; }\n public get isZero(): boolean { return 0 === this._numerator; }\n\n public getIntegralString(): string {\n if (this._textParts.length > 0)\n return this._textParts[0];\n\n return \"\";\n }\n\n public getNumeratorString(): string {\n if (this._textParts.length >= 3)\n return this._textParts[1];\n\n return \"\";\n }\n\n public getDenominatorString(): string {\n if (this._textParts.length >= 3)\n return this._textParts[2];\n\n return \"\";\n }\n\n private formTextParts(reduce: boolean): void {\n let numerator = this._numerator;\n let denominator = this._denominator;\n\n if (reduce && this._greatestCommonFactor > 1) {\n numerator /= this.greatestCommonFactor;\n denominator /= this.greatestCommonFactor;\n }\n\n this._textParts.push(this._integral.toFixed(0));\n if (numerator > 0) {\n this._textParts.push(numerator.toFixed(0));\n this._textParts.push(denominator.toFixed(0));\n }\n }\n}\n\n/** A helper class that contains methods used to format quantity values based on a format that are defined via the Format class.\n * @beta\n */\nexport class Formatter {\n private static FPV_MINTHRESHOLD = 1.0e-14;\n\n private static isNegligible(value: number): boolean { return (Math.abs(value) < Formatter.FPV_MINTHRESHOLD); }\n\n /** Return floating point value rounded by specific rounding factor.\n * @param value Value to be rounded.\n * @param roundTo Rounding factor.\n */\n private static roundDouble(value: number, roundTo: number): number {\n if (Formatter.isNegligible(roundTo))\n return value;\n\n roundTo = Math.abs(roundTo);\n let rnd = FPV_ROUNDFACTOR + (value / roundTo);\n const iVal = Math.floor(rnd);\n rnd = iVal * roundTo;\n return (value < 0.0) ? -rnd : rnd;\n }\n\n /** Generate a formatted text string integer value insert 1000 separators if appropriate.\n * @param wholePart Integer value to be formatted.\n */\n private static integerPartToText(wholePart: number, spec: FormatterSpec): string {\n // build invariant string represent wholePart\n let formattedValue = wholePart.toFixed(0);\n\n if ((formattedValue.length > 3) && (spec.format.hasFormatTraitSet(FormatTraits.Use1000Separator) && (spec.format.thousandSeparator.length > 0))) {\n let numSeparators = Math.floor(formattedValue.length / 3);\n let groupLength = formattedValue.length % 3;\n\n if (groupLength === 0) {\n numSeparators = numSeparators - 1;\n groupLength = groupLength + 3;\n }\n\n let outString = formattedValue.substring(0, groupLength);\n\n for (let i = 1; i <= numSeparators; i += 1) {\n outString = outString + spec.format.thousandSeparator + formattedValue.substring(groupLength, groupLength + 3);\n groupLength = groupLength + 3;\n }\n\n formattedValue = outString;\n }\n\n return formattedValue;\n }\n\n /** Trim trailing \"0\" from the text that represent the fractional part of a floating point value.\n * @param strVal The value string.\n */\n private static trimTrailingZeroes(strVal: string): string {\n let lastNonZeroCharIndex = -1;\n for (let i = strVal.length - 1; i >= 0; i--) {\n if (strVal.charCodeAt(i) !== QuantityConstants.CHAR_DIGIT_ZERO) {\n lastNonZeroCharIndex = i;\n break;\n }\n }\n if (lastNonZeroCharIndex >= 0)\n return strVal.substring(0, lastNonZeroCharIndex + 1);\n return \"\";\n }\n\n /** Format a quantity value into a composite format such as ft-in or deg-min-sec.\n * @param compositeValue The value for this part of the composite\n * @param isLastPart If false the composite value should be a whole value, if true then the value should be formatted as a floating point value.\n * @param label Label for this part of the composite. This will be either the default unit label or a custom label specified the format specification.\n */\n private static formatCompositePart(compositeValue: number, isLastPart: boolean, label: string, spec: FormatterSpec): string {\n let componentText = \"\";\n if (!isLastPart) {\n componentText = Formatter.integerPartToText(compositeValue, spec);\n if(spec.format.minWidth) { // integerPartToText does not do this padding\n componentText = this.countAndPad(componentText, spec.format.minWidth);\n }\n } else {\n componentText = Formatter.formatMagnitude(compositeValue, spec);\n }\n\n if (spec.format.hasFormatTraitSet(FormatTraits.ShowUnitLabel)) {\n componentText = componentText + spec.format.uomSeparator + label;\n }\n\n return componentText;\n }\n\n /** Format a quantity value into a composite format such as ft-in or deg-min-sec.\n * @param magnitude quantity value\n * @param fromUnit quantity unit\n */\n private static formatComposite(magnitude: number, spec: FormatterSpec): string {\n const compositeStrings: string[] = [];\n\n // Caller will deal with appending +||-||() value sign as specified by formatting options so just format positive value\n let posMagnitude = Math.abs(magnitude);\n\n for (let i = 0; i < spec.unitConversions.length; i++) {\n const currentLabel = spec.unitConversions[i].label;\n const unitConversion = spec.unitConversions[i].conversion;\n\n if (i > 0 && unitConversion.factor < 1.0)\n throw new QuantityError(QuantityStatus.InvalidCompositeFormat, `The Format ${spec.format.name} has a invalid unit specification.`);\n if (i > 0 && unitConversion.offset !== 0) // offset should only ever be defined for major unit\n throw new QuantityError(QuantityStatus.InvalidCompositeFormat, `The Format ${spec.format.name} has a invalid unit specification.`);\n\n let unitValue = 0.0;\n if (spec.format.type === FormatType.Ratio){\n if (1 !== spec.format.units!.length)\n throw new QuantityError(QuantityStatus.InvalidCompositeFormat, `The Format '${spec.format.name}' with type 'ratio' must have exactly one unit.`);\n\n try {\n unitValue = applyConversion(posMagnitude, unitConversion) + this.FPV_MINTHRESHOLD;\n } catch (e) {\n // The \"InvertingZero\" error is thrown when the value is zero and the conversion factor is inverted.\n // For ratio, we actually want to support this corner case and return \"1:0\" as the formatted value.\n if (e instanceof QuantityError && e.errorNumber === QuantityStatus.InvertingZero) {\n return \"1:0\";\n }\n }\n\n compositeStrings.push(this.formatRatio(unitValue, spec));\n continue;\n }\n\n unitValue = applyConversion(posMagnitude, unitConversion) + this.FPV_MINTHRESHOLD;\n\n if (0 === i) {\n const precisionScale = Math.pow(10, 8); // use a fixed round off precision of 8 to avoid loss of precision in actual magnitude\n unitValue = Math.floor(unitValue * precisionScale + FPV_ROUNDFACTOR) / precisionScale;\n if ((Math.abs(unitValue) < 0.0001) && spec.format.hasFormatTraitSet(FormatTraits.ZeroEmpty))\n return \"\";\n }\n\n if (i < spec.format.units!.length - 1) {\n const wholePart = Math.floor(unitValue);\n const componentText = Formatter.formatCompositePart(wholePart, false, currentLabel, spec);\n posMagnitude = unitValue - wholePart;\n compositeStrings.push(componentText);\n } else {\n const componentText = Formatter.formatCompositePart(unitValue, true, currentLabel, spec);\n compositeStrings.push(componentText);\n }\n }\n\n return compositeStrings.join(spec.format.spacerOrDefault);\n }\n\n /** Format a quantity value into a single text string. Imitate how formatting done by server method NumericFormatSpec::FormatDouble.\n * @param magnitude quantity value\n */\n private static formatMagnitude(magnitude: number, spec: FormatterSpec): string {\n let posMagnitude = Math.abs(magnitude);\n if ((Math.abs(posMagnitude) < 0.0001) && spec.format.hasFormatTraitSet(FormatTraits.ZeroEmpty))\n return \"\";\n\n if (spec.format.hasFormatTraitSet(FormatTraits.ApplyRounding))\n posMagnitude = Math.abs(Formatter.roundDouble(magnitude, spec.format.roundFactor));\n\n const isSci = ((posMagnitude > 1.0e12) || spec.format.type === FormatType.Scientific);\n const isDecimal = (isSci || spec.format.type === FormatType.Decimal || spec.format.type === FormatType.Bearing || spec.format.type === FormatType.Azimuth) || spec.format.type === FormatType.Ratio;\n const isFractional = (!isDecimal && spec.format.type === FormatType.Fractional);\n /* const usesStops = spec.format.type === FormatType.Station; */\n const isPrecisionZero = spec.format.precision === DecimalPrecision.Zero;\n const isKeepSingleZero = spec.format.hasFormatTraitSet(FormatTraits.KeepSingleZero);\n const precisionScale = Math.pow(10.0, spec.format.precision);\n const isKeepTrailingZeroes = spec.format.hasFormatTraitSet(FormatTraits.TrailZeroes);\n let expInt = 0.0;\n\n if (isSci && (posMagnitude !== 0.0)) {\n let exp = Math.log10(posMagnitude);\n let negativeExp = false;\n if (exp < 0.0) {\n exp = -exp;\n negativeExp = true;\n }\n\n expInt = Math.floor(exp);\n if (spec.format.type === FormatType.Scientific) {\n if (spec.format.scientificType === ScientificType.ZeroNormalized && posMagnitude > 1.0)\n expInt += 1.0;\n else if (spec.format.scientificType === ScientificType.Normalized && posMagnitude < 1.0)\n expInt += 1.0;\n\n if (negativeExp)\n expInt = -expInt;\n }\n\n const factor = Math.pow(10.0, -expInt);\n posMagnitude *= factor;\n }\n\n let formattedValue = \"\";\n if (isDecimal) {\n const actualVal = isPrecisionZero ? posMagnitude + FPV_ROUNDFACTOR : posMagnitude + Formatter.FPV_MINTHRESHOLD;\n let wholePart = Math.floor(actualVal);\n let fractionPart = actualVal - wholePart;\n if (!isPrecisionZero) {\n fractionPart = Math.abs(fractionPart) * precisionScale + FPV_ROUNDFACTOR;\n if (fractionPart >= precisionScale) {\n wholePart += 1;\n fractionPart -= precisionScale;\n }\n }\n\n formattedValue = Formatter.integerPartToText(wholePart, spec);\n if (isPrecisionZero) {\n if (spec.format.hasFormatTraitSet(FormatTraits.KeepDecimalPoint) && !isKeepSingleZero)\n formattedValue = formattedValue + spec.format.decimalSeparator;\n else if (isKeepSingleZero)\n formattedValue = `${formattedValue + spec.format.decimalSeparator}0`;\n } else {\n fractionPart = Math.floor(fractionPart) / precisionScale;\n let fractionString = fractionPart.toFixed(spec.format.precision);\n // remove leading \"0.\"\n fractionString = fractionString.substring(2).padEnd(spec.format.precision, \"0\");\n if (!isKeepTrailingZeroes)\n fractionString = Formatter.trimTrailingZeroes(fractionString);\n\n if (fractionString.length > 0)\n formattedValue = formattedValue + spec.format.decimalSeparator + fractionString;\n else {\n if (spec.format.hasFormatTraitSet(FormatTraits.KeepDecimalPoint))\n formattedValue = formattedValue + spec.format.decimalSeparator + (isKeepSingleZero ? \"0\" : \"\");\n }\n }\n\n if (isSci) {\n const expString = `e${expInt.toFixed(0)}`;\n formattedValue = formattedValue + expString;\n }\n } else if (isFractional) {\n const fn = new FractionalNumeric(posMagnitude, spec.format.precision as FractionalPrecision, true);\n formattedValue = fn.getIntegralString();\n\n if (!fn.isZero && fn.hasFractionPart) {\n const wholeFractionSeparator = spec.format.hasFormatTraitSet(FormatTraits.FractionDash) ? \"-\" : \" \";\n const fractionString = `${fn.getNumeratorString()}/${fn.getDenominatorString()}`;\n formattedValue = formattedValue + wholeFractionSeparator + fractionString;\n }\n } else /* if (usesStops)*/ {\n // we assume that stopping value is always positive\n posMagnitude = Math.floor(posMagnitude * precisionScale + FPV_ROUNDFACTOR) / precisionScale;\n\n const baseFactor = spec.format.stationBaseFactor ?? 1;\n const stationOffsetSize = spec.format.stationOffsetSize || 0; // Provide default if undefined\n const denominator = baseFactor * Math.pow(10, stationOffsetSize);\n const tVal = Math.floor(posMagnitude); // this is the integer part only\n const hiPart = Math.floor(tVal / denominator);\n const lowPart = tVal - hiPart * denominator;\n const fract = posMagnitude - tVal;\n const fractionPart = Math.floor(fract * precisionScale + FPV_ROUNDFACTOR);\n const stationString = hiPart.toFixed(0) + spec.format.stationSeparator + lowPart.toFixed(0).padStart(stationOffsetSize, \"0\");\n let fractionString = \"\";\n if (fractionPart > 0) {\n fractionString = (fractionPart/precisionScale).toFixed(spec.format.precision);\n // remove leading \"0.\"\n fractionString = fractionString.substring(2).padEnd(spec.format.precision, \"0\");\n if (!isKeepTrailingZeroes)\n fractionString = Formatter.trimTrailingZeroes(fractionString);\n\n formattedValue = stationString + spec.format.decimalSeparator + fractionString;\n } else {\n if (isKeepTrailingZeroes)\n fractionString = spec.format.decimalSeparator + \"\".padEnd(spec.format.precision, \"0\");\n else if (spec.format.hasFormatTraitSet(FormatTraits.KeepDecimalPoint))\n fractionString = spec.format.decimalSeparator;\n formattedValue = stationString + fractionString;\n }\n }\n\n if(spec.format.minWidth) {\n formattedValue = this.countAndPad(formattedValue, spec.format.minWidth);\n }\n\n return formattedValue;\n }\n\n private static countAndPad(value: string, minWidth: number): string {\n const regex = /[\\d,.]/g;\n const matches = value.match(regex);\n const count = matches ? matches.length : 0;\n if (count < minWidth) {\n value = value.padStart(minWidth, \"0\");\n }\n return value;\n }\n\n /** Format a quantity value into a single text string based on the current format specification of this class.\n * @param magnitude defines the value to spec.format.\n * @param spec A FormatterSpec object the defines specification for the magnitude and unit conversions for the formatter.\n */\n public static formatQuantity(magnitude: number, spec: FormatterSpec): string {\n const valueIsNegative = magnitude < 0.0;\n let prefix = \"\";\n let suffix = \"\";\n let formattedValue = \"\";\n if(spec.format.type === FormatType.Bearing || spec.format.type === FormatType.Azimuth) {\n const result = this.processBearingAndAzimuth(magnitude, spec);\n magnitude = result.magnitude;\n prefix = result.prefix ?? \"\";\n suffix = result.suffix ?? \"\";\n }\n\n switch (spec.format.showSignOption) {\n case ShowSignOption.NegativeParentheses:\n if (valueIsNegative) {\n prefix += \"(\";\n suffix = `)${suffix}`;\n }\n break;\n\n case ShowSignOption.OnlyNegative:\n if (valueIsNegative && spec.format.type !== FormatType.Bearing && spec.format.type !== FormatType.Azimuth)\n prefix += \"-\";\n\n break;\n\n case ShowSignOption.SignAlways:\n if (valueIsNegative)\n prefix += \"-\";\n else\n prefix += \"+\";\n\n break;\n\n case ShowSignOption.NoSign:\n default:\n break;\n }\n\n let formattedMagnitude = \"\";\n\n if (spec.format.hasUnits) {\n formattedMagnitude = Formatter.formatComposite(magnitude, spec);\n } else {\n // unitless quantity\n formattedMagnitude = Formatter.formatMagnitude(magnitude, spec);\n if (formattedMagnitude.length > 0 && spec.unitConversions.length > 0 && spec.format.hasFormatTraitSet(FormatTraits.ShowUnitLabel)) {\n if (spec.format.hasFormatTraitSet(FormatTraits.PrependUnitLabel))\n formattedMagnitude = spec.unitConversions[0].label + spec.format.uomSeparator + formattedMagnitude;\n else\n formattedMagnitude = formattedMagnitude + spec.format.uomSeparator + spec.unitConversions[0].label;\n }\n }\n // add Sign prefix and suffix as necessary\n if ((prefix.length > 0 || suffix.length > 0) && formattedMagnitude.length > 0)\n formattedValue = prefix + formattedMagnitude + suffix;\n else\n formattedValue = formattedMagnitude;\n\n return formattedValue;\n }\n\n private static processBearingAndAzimuth(magnitude: number, spec: FormatterSpec): {magnitude: number, prefix?: string, suffix?: string} {\n const type = spec.format.type;\n if (type !== FormatType.Bearing && type !== FormatType.Azimuth)\n return {magnitude};\n\n const revolution = this.getRevolution(spec);\n magnitude = this.normalizeAngle(magnitude, revolution);\n const quarterRevolution = revolution / 4;\n\n if (type === FormatType.Bearing) {\n let quadrant = 0;\n while (magnitude > quarterRevolution) {\n magnitude -= quarterRevolution;\n quadrant++;\n }\n let prefix, suffix: string;\n\n // Quadrants are\n // 3 0\n // 2 1\n // For quadrants 1 and 3 we have to subtract the angle from quarterRevolution degrees because they go counter-clockwise\n if (quadrant === 1 || quadrant === 3)\n magnitude = quarterRevolution - magnitude;\n\n // TODO: at some point we will want to open this for localization, in the first release it's going to be hard coded\n if (quadrant === 0 || quadrant === 3)\n prefix = \"N\";\n\n if (quadrant === 2 || quadrant === 1)\n prefix = \"S\";\n\n if (quadrant === 0 || quadrant === 1)\n suffix = \"E\";\n\n if (quadrant === 3 || quadrant === 2)\n suffix = \"W\";\n\n // special case, if in quadrant 2 and value is very close to quarter revolution (90°), turn prefix to N because N90:00:00W is preferred over S90:00:00W\n if (quadrant === 2 && spec.unitConversions.length > 0) {\n // To determine if value is small, we need to convert it to the smallest unit presented and use the provided precision on it\n const unitConversion = spec.unitConversions[spec.unitConversions.length - 1].conversion;\n const smallestFormattedDelta = applyConversion((quarterRevolution - magnitude), unitConversion) + this.FPV_MINTHRESHOLD;\n\n const precisionScale = Math.pow(10.0, spec.format.precision);\n const floor = Math.floor((smallestFormattedDelta) * precisionScale + FPV_ROUNDFACTOR) / precisionScale;\n if(floor === 0) {\n prefix = \"N\";\n }\n }\n\n return {magnitude, prefix, suffix: suffix!};\n }\n\n if (type === FormatType.Azimuth) {\n let azimuthBase = 0; // default base is North\n if (spec.format.azimuthBase !== undefined) {\n if (spec.azimuthBaseConversion === undefined) {\n throw new QuantityError(QuantityStatus.MissingRequiredProperty, `Missing azimuth base conversion for interpreting ${spec.name}'s azimuth base.`);\n }\n const azBaseQuantity: Quantity = new Quantity(spec.format.azimuthBaseUnit, spec.format.azimuthBase);\n const azBaseConverted = azBaseQuantity.convertTo(spec.persistenceUnit, spec.azimuthBaseConversion);\n if (azBaseConverted === undefined || !azBaseConverted.isValid) {\n throw new QuantityError(QuantityStatus.UnsupportedUnit, `Failed to convert azimuth base unit to ${spec.persistenceUnit.name}.`);\n }\n azimuthBase = this.normalizeAngle(azBaseConverted.magnitude, revolution);\n }\n\n if (azimuthBase === 0.0 && spec.format.azimuthClockwiseOrDefault)\n return {magnitude}; // no conversion necessary, the input is already using the result parameters (north base and clockwise)\n\n // subtract the base from the actual value\n magnitude -= azimuthBase;\n if (spec.format.azimuthClockwiseOrDefault)\n return {magnitude: this.normalizeAngle(magnitude, revolution)};\n\n // turn it into a counter-clockwise angle\n magnitude = revolution - magnitude;\n // normalize the result as it may have become negative or exceed the revolution\n magnitude = this.normalizeAngle(magnitude, revolution);\n }\n\n return {magnitude};\n }\n\n private static normalizeAngle(magnitude: number, revolution: number): number {\n magnitude = magnitude % revolution; // Strip anything that goes around more than once\n\n if (magnitude < 0) // If the value is negative, we want to normalize it to a positive angle\n magnitude += revolution;\n\n return magnitude;\n }\n\n private static getRevolution(spec: FormatterSpec): number {\n if (spec.revolutionConversion === undefined) {\n throw new QuantityError(QuantityStatus.MissingRequiredProperty, `Missing revolution unit conversion for calculating ${spec.name}'s revolution.`);\n }\n\n const revolution: Quantity = new Quantity(spec.format.revolutionUnit, 1.0);\n const converted = revolution.convertTo(spec.persistenceUnit, spec.revolutionConversion);\n if (converted === undefined || !converted.isValid) {\n throw new QuantityError(QuantityStatus.UnsupportedUnit, `Failed to convert revolution unit to ${spec.persistenceUnit.name}.`);\n }\n\n return converted.magnitude;\n }\n\n private static formatRatio(magnitude: number, spec: FormatterSpec): string {\n if (null === spec.format.ratioType)\n throw new QuantityError(QuantityStatus.InvalidCompositeFormat, `The Format ${spec.format.name} must have a ratio type specified.`);\n\n const precisionScale = Math.pow(10.0, spec.format.precision);\n\n let reciprocal = 0;\n\n if (magnitude === 0.0)\n return \"0:1\";\n else\n reciprocal = 1.0/magnitude;\n\n switch (spec.format.ratioType) {\n case RatioType.OneToN:\n return `1:${this.formatMagnitude(reciprocal, spec)}`;\n case RatioType.NToOne:\n return `${this.formatMagnitude(magnitude, spec)}:1`;\n case RatioType.ValueBased:\n if (magnitude > 1.0)\n return `${this.formatMagnitude(magnitude, spec)}:1`;\n else\n return `1:${this.formatMagnitude(reciprocal, spec)}`;\n case RatioType.UseGreatestCommonDivisor:\n magnitude = Math.round(magnitude * precisionScale)/precisionScale;\n let numerator = magnitude * precisionScale;\n let denominator = precisionScale;\n\n const gcd = FractionalNumeric.getGreatestCommonFactor(numerator, denominator);\n numerator /= gcd;\n denominator /= gcd;\n\n return `${this.formatMagnitude(numerator, spec)}:${this.formatMagnitude(denominator, spec)}`;\n default:\n throw new QuantityError(QuantityStatus.InvalidCompositeFormat, `The Format ${spec.format.name} has an invalid ratio type specified.`);\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"Formatter.js","sourceRoot":"","sources":["../../../src/Formatter/Formatter.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Quantity\r\n */\r\n\r\nimport { QuantityConstants } from \"../Constants\";\r\nimport { QuantityError, QuantityStatus } from \"../Exception\";\r\nimport { FormatterSpec } from \"./FormatterSpec\";\r\nimport { DecimalPrecision, FormatTraits, FormatType, FractionalPrecision, RatioType, ScientificType, ShowSignOption } from \"./FormatEnums\";\r\nimport { applyConversion, Quantity } from \"../Quantity\";\r\n\r\n/** rounding additive\r\n * @internal\r\n */\r\nconst FPV_ROUNDFACTOR = 0.50000000001;\r\n\r\n/** A private helper class used to format fraction part of value into a numerator and denominator.\r\n * @internal\r\n */\r\nclass FractionalNumeric {\r\n private _integral: number = 0;\r\n private _numerator: number = 0;\r\n private _denominator: number = 1;\r\n private _greatestCommonFactor: number = 1;\r\n private _textParts: string[] = [];\r\n\r\n constructor(value: number, precision: FractionalPrecision, reduce: boolean) {\r\n this.calculate(value, precision as number);\r\n this.formTextParts(reduce);\r\n }\r\n\r\n private calculate(value: number, denominator: number) {\r\n const positiveValue = Math.abs(value);\r\n this._denominator = denominator;\r\n this._integral = Math.floor(positiveValue);\r\n const fractionPart = positiveValue - this._integral;\r\n this._numerator = Math.floor(fractionPart * this._denominator + FPV_ROUNDFACTOR);\r\n\r\n if (0 !== denominator && (this._numerator / this._denominator) === 1) {\r\n this._numerator = 0;\r\n this._integral += 1;\r\n } else {\r\n this._greatestCommonFactor = FractionalNumeric.getGreatestCommonFactor(this._numerator, this._denominator);\r\n }\r\n }\r\n\r\n /** Determine the GCD given two values. This value can be used to reduce a fraction.\r\n * See algorithm description http://en.wikipedia.org/wiki/Euclidean_algorithm\r\n */\r\n public static getGreatestCommonFactor(numerator: number, denominator: number): number {\r\n let r;\r\n while (denominator !== 0) {\r\n r = numerator % denominator;\r\n numerator = denominator;\r\n denominator = r;\r\n }\r\n return (numerator < 0) ? -numerator : numerator;\r\n }\r\n\r\n public get greatestCommonFactor(): number { return this._greatestCommonFactor; }\r\n public get hasFractionPart(): boolean { return this._textParts.length > 0; }\r\n public get isZero(): boolean { return 0 === this._numerator; }\r\n\r\n public getIntegralString(): string {\r\n if (this._textParts.length > 0)\r\n return this._textParts[0];\r\n\r\n return \"\";\r\n }\r\n\r\n public getNumeratorString(): string {\r\n if (this._textParts.length >= 3)\r\n return this._textParts[1];\r\n\r\n return \"\";\r\n }\r\n\r\n public getDenominatorString(): string {\r\n if (this._textParts.length >= 3)\r\n return this._textParts[2];\r\n\r\n return \"\";\r\n }\r\n\r\n private formTextParts(reduce: boolean): void {\r\n let numerator = this._numerator;\r\n let denominator = this._denominator;\r\n\r\n if (reduce && this._greatestCommonFactor > 1) {\r\n numerator /= this.greatestCommonFactor;\r\n denominator /= this.greatestCommonFactor;\r\n }\r\n\r\n this._textParts.push(this._integral.toFixed(0));\r\n if (numerator > 0) {\r\n this._textParts.push(numerator.toFixed(0));\r\n this._textParts.push(denominator.toFixed(0));\r\n }\r\n }\r\n}\r\n\r\n/** A helper class that contains methods used to format quantity values based on a format that are defined via the Format class.\r\n * @beta\r\n */\r\nexport class Formatter {\r\n private static FPV_MINTHRESHOLD = 1.0e-14;\r\n\r\n private static isNegligible(value: number): boolean { return (Math.abs(value) < Formatter.FPV_MINTHRESHOLD); }\r\n\r\n /** Return floating point value rounded by specific rounding factor.\r\n * @param value Value to be rounded.\r\n * @param roundTo Rounding factor.\r\n */\r\n private static roundDouble(value: number, roundTo: number): number {\r\n if (Formatter.isNegligible(roundTo))\r\n return value;\r\n\r\n roundTo = Math.abs(roundTo);\r\n let rnd = FPV_ROUNDFACTOR + (value / roundTo);\r\n const iVal = Math.floor(rnd);\r\n rnd = iVal * roundTo;\r\n return (value < 0.0) ? -rnd : rnd;\r\n }\r\n\r\n /** Generate a formatted text string integer value insert 1000 separators if appropriate.\r\n * @param wholePart Integer value to be formatted.\r\n */\r\n private static integerPartToText(wholePart: number, spec: FormatterSpec): string {\r\n // build invariant string represent wholePart\r\n let formattedValue = wholePart.toFixed(0);\r\n\r\n if ((formattedValue.length > 3) && (spec.format.hasFormatTraitSet(FormatTraits.Use1000Separator) && (spec.format.thousandSeparator.length > 0))) {\r\n let numSeparators = Math.floor(formattedValue.length / 3);\r\n let groupLength = formattedValue.length % 3;\r\n\r\n if (groupLength === 0) {\r\n numSeparators = numSeparators - 1;\r\n groupLength = groupLength + 3;\r\n }\r\n\r\n let outString = formattedValue.substring(0, groupLength);\r\n\r\n for (let i = 1; i <= numSeparators; i += 1) {\r\n outString = outString + spec.format.thousandSeparator + formattedValue.substring(groupLength, groupLength + 3);\r\n groupLength = groupLength + 3;\r\n }\r\n\r\n formattedValue = outString;\r\n }\r\n\r\n return formattedValue;\r\n }\r\n\r\n /** Trim trailing \"0\" from the text that represent the fractional part of a floating point value.\r\n * @param strVal The value string.\r\n */\r\n private static trimTrailingZeroes(strVal: string): string {\r\n let lastNonZeroCharIndex = -1;\r\n for (let i = strVal.length - 1; i >= 0; i--) {\r\n if (strVal.charCodeAt(i) !== QuantityConstants.CHAR_DIGIT_ZERO) {\r\n lastNonZeroCharIndex = i;\r\n break;\r\n }\r\n }\r\n if (lastNonZeroCharIndex >= 0)\r\n return strVal.substring(0, lastNonZeroCharIndex + 1);\r\n return \"\";\r\n }\r\n\r\n /** Format a quantity value into a composite format such as ft-in or deg-min-sec.\r\n * @param compositeValue The value for this part of the composite\r\n * @param isLastPart If false the composite value should be a whole value, if true then the value should be formatted as a floating point value.\r\n * @param label Label for this part of the composite. This will be either the default unit label or a custom label specified the format specification.\r\n */\r\n private static formatCompositePart(compositeValue: number, isLastPart: boolean, label: string, spec: FormatterSpec): string {\r\n let componentText = \"\";\r\n if (!isLastPart) {\r\n componentText = Formatter.integerPartToText(compositeValue, spec);\r\n if(spec.format.minWidth) { // integerPartToText does not do this padding\r\n componentText = this.countAndPad(componentText, spec.format.minWidth);\r\n }\r\n } else {\r\n componentText = Formatter.formatMagnitude(compositeValue, spec);\r\n }\r\n\r\n if (spec.format.hasFormatTraitSet(FormatTraits.ShowUnitLabel)) {\r\n componentText = componentText + spec.format.uomSeparator + label;\r\n }\r\n\r\n return componentText;\r\n }\r\n\r\n /** Format a quantity value into a composite format such as ft-in or deg-min-sec.\r\n * @param magnitude quantity value\r\n * @param fromUnit quantity unit\r\n */\r\n private static formatComposite(magnitude: number, spec: FormatterSpec): string {\r\n const compositeStrings: string[] = [];\r\n\r\n // Caller will deal with appending +||-||() value sign as specified by formatting options so just format positive value\r\n let posMagnitude = Math.abs(magnitude);\r\n\r\n for (let i = 0; i < spec.unitConversions.length; i++) {\r\n const currentLabel = spec.unitConversions[i].label;\r\n const unitConversion = spec.unitConversions[i].conversion;\r\n\r\n if (i > 0 && unitConversion.factor < 1.0)\r\n throw new QuantityError(QuantityStatus.InvalidCompositeFormat, `The Format ${spec.format.name} has a invalid unit specification.`);\r\n if (i > 0 && unitConversion.offset !== 0) // offset should only ever be defined for major unit\r\n throw new QuantityError(QuantityStatus.InvalidCompositeFormat, `The Format ${spec.format.name} has a invalid unit specification.`);\r\n\r\n let unitValue = 0.0;\r\n if (spec.format.type === FormatType.Ratio){\r\n if (1 !== spec.format.units!.length)\r\n throw new QuantityError(QuantityStatus.InvalidCompositeFormat, `The Format '${spec.format.name}' with type 'ratio' must have exactly one unit.`);\r\n\r\n try {\r\n unitValue = applyConversion(posMagnitude, unitConversion) + this.FPV_MINTHRESHOLD;\r\n } catch (e) {\r\n // The \"InvertingZero\" error is thrown when the value is zero and the conversion factor is inverted.\r\n // For ratio, we actually want to support this corner case and return \"1:0\" as the formatted value.\r\n if (e instanceof QuantityError && e.errorNumber === QuantityStatus.InvertingZero) {\r\n return \"1:0\";\r\n }\r\n }\r\n\r\n compositeStrings.push(this.formatRatio(unitValue, spec));\r\n continue;\r\n }\r\n\r\n unitValue = applyConversion(posMagnitude, unitConversion) + this.FPV_MINTHRESHOLD;\r\n\r\n if (0 === i) {\r\n const precisionScale = Math.pow(10, 8); // use a fixed round off precision of 8 to avoid loss of precision in actual magnitude\r\n unitValue = Math.floor(unitValue * precisionScale + FPV_ROUNDFACTOR) / precisionScale;\r\n if ((Math.abs(unitValue) < 0.0001) && spec.format.hasFormatTraitSet(FormatTraits.ZeroEmpty))\r\n return \"\";\r\n }\r\n\r\n if (i < spec.format.units!.length - 1) {\r\n const wholePart = Math.floor(unitValue);\r\n const componentText = Formatter.formatCompositePart(wholePart, false, currentLabel, spec);\r\n posMagnitude = unitValue - wholePart;\r\n compositeStrings.push(componentText);\r\n } else {\r\n const componentText = Formatter.formatCompositePart(unitValue, true, currentLabel, spec);\r\n compositeStrings.push(componentText);\r\n }\r\n }\r\n\r\n return compositeStrings.join(spec.format.spacerOrDefault);\r\n }\r\n\r\n /** Format a quantity value into a single text string. Imitate how formatting done by server method NumericFormatSpec::FormatDouble.\r\n * @param magnitude quantity value\r\n */\r\n private static formatMagnitude(magnitude: number, spec: FormatterSpec): string {\r\n let posMagnitude = Math.abs(magnitude);\r\n if ((Math.abs(posMagnitude) < 0.0001) && spec.format.hasFormatTraitSet(FormatTraits.ZeroEmpty))\r\n return \"\";\r\n\r\n if (spec.format.hasFormatTraitSet(FormatTraits.ApplyRounding))\r\n posMagnitude = Math.abs(Formatter.roundDouble(magnitude, spec.format.roundFactor));\r\n\r\n const isSci = ((posMagnitude > 1.0e12) || spec.format.type === FormatType.Scientific);\r\n const isDecimal = (isSci || spec.format.type === FormatType.Decimal || spec.format.type === FormatType.Bearing || spec.format.type === FormatType.Azimuth) || spec.format.type === FormatType.Ratio;\r\n const isFractional = (!isDecimal && spec.format.type === FormatType.Fractional);\r\n /* const usesStops = spec.format.type === FormatType.Station; */\r\n const isPrecisionZero = spec.format.precision === DecimalPrecision.Zero;\r\n const isKeepSingleZero = spec.format.hasFormatTraitSet(FormatTraits.KeepSingleZero);\r\n const precisionScale = Math.pow(10.0, spec.format.precision);\r\n const isKeepTrailingZeroes = spec.format.hasFormatTraitSet(FormatTraits.TrailZeroes);\r\n let expInt = 0.0;\r\n\r\n if (isSci && (posMagnitude !== 0.0)) {\r\n let exp = Math.log10(posMagnitude);\r\n let negativeExp = false;\r\n if (exp < 0.0) {\r\n exp = -exp;\r\n negativeExp = true;\r\n }\r\n\r\n expInt = Math.floor(exp);\r\n if (spec.format.type === FormatType.Scientific) {\r\n if (spec.format.scientificType === ScientificType.ZeroNormalized && posMagnitude > 1.0)\r\n expInt += 1.0;\r\n else if (spec.format.scientificType === ScientificType.Normalized && posMagnitude < 1.0)\r\n expInt += 1.0;\r\n\r\n if (negativeExp)\r\n expInt = -expInt;\r\n }\r\n\r\n const factor = Math.pow(10.0, -expInt);\r\n posMagnitude *= factor;\r\n }\r\n\r\n let formattedValue = \"\";\r\n if (isDecimal) {\r\n const actualVal = isPrecisionZero ? posMagnitude + FPV_ROUNDFACTOR : posMagnitude + Formatter.FPV_MINTHRESHOLD;\r\n let wholePart = Math.floor(actualVal);\r\n let fractionPart = actualVal - wholePart;\r\n if (!isPrecisionZero) {\r\n fractionPart = Math.abs(fractionPart) * precisionScale + FPV_ROUNDFACTOR;\r\n if (fractionPart >= precisionScale) {\r\n wholePart += 1;\r\n fractionPart -= precisionScale;\r\n }\r\n }\r\n\r\n formattedValue = Formatter.integerPartToText(wholePart, spec);\r\n if (isPrecisionZero) {\r\n if (spec.format.hasFormatTraitSet(FormatTraits.KeepDecimalPoint) && !isKeepSingleZero)\r\n formattedValue = formattedValue + spec.format.decimalSeparator;\r\n else if (isKeepSingleZero)\r\n formattedValue = `${formattedValue + spec.format.decimalSeparator}0`;\r\n } else {\r\n fractionPart = Math.floor(fractionPart) / precisionScale;\r\n let fractionString = fractionPart.toFixed(spec.format.precision);\r\n // remove leading \"0.\"\r\n fractionString = fractionString.substring(2).padEnd(spec.format.precision, \"0\");\r\n if (!isKeepTrailingZeroes)\r\n fractionString = Formatter.trimTrailingZeroes(fractionString);\r\n\r\n if (fractionString.length > 0)\r\n formattedValue = formattedValue + spec.format.decimalSeparator + fractionString;\r\n else {\r\n if (spec.format.hasFormatTraitSet(FormatTraits.KeepDecimalPoint))\r\n formattedValue = formattedValue + spec.format.decimalSeparator + (isKeepSingleZero ? \"0\" : \"\");\r\n }\r\n }\r\n\r\n if (isSci) {\r\n const expString = `e${expInt.toFixed(0)}`;\r\n formattedValue = formattedValue + expString;\r\n }\r\n } else if (isFractional) {\r\n const fn = new FractionalNumeric(posMagnitude, spec.format.precision as FractionalPrecision, true);\r\n formattedValue = fn.getIntegralString();\r\n\r\n if (!fn.isZero && fn.hasFractionPart) {\r\n const wholeFractionSeparator = spec.format.hasFormatTraitSet(FormatTraits.FractionDash) ? \"-\" : \" \";\r\n const fractionString = `${fn.getNumeratorString()}/${fn.getDenominatorString()}`;\r\n formattedValue = formattedValue + wholeFractionSeparator + fractionString;\r\n }\r\n } else /* if (usesStops)*/ {\r\n // we assume that stopping value is always positive\r\n posMagnitude = Math.floor(posMagnitude * precisionScale + FPV_ROUNDFACTOR) / precisionScale;\r\n\r\n const baseFactor = spec.format.stationBaseFactor ?? 1;\r\n const stationOffsetSize = spec.format.stationOffsetSize || 0; // Provide default if undefined\r\n const denominator = baseFactor * Math.pow(10, stationOffsetSize);\r\n const tVal = Math.floor(posMagnitude); // this is the integer part only\r\n const hiPart = Math.floor(tVal / denominator);\r\n const lowPart = tVal - hiPart * denominator;\r\n const fract = posMagnitude - tVal;\r\n const fractionPart = Math.floor(fract * precisionScale + FPV_ROUNDFACTOR);\r\n const stationString = hiPart.toFixed(0) + spec.format.stationSeparator + lowPart.toFixed(0).padStart(stationOffsetSize, \"0\");\r\n let fractionString = \"\";\r\n if (fractionPart > 0) {\r\n fractionString = (fractionPart/precisionScale).toFixed(spec.format.precision);\r\n // remove leading \"0.\"\r\n fractionString = fractionString.substring(2).padEnd(spec.format.precision, \"0\");\r\n if (!isKeepTrailingZeroes)\r\n fractionString = Formatter.trimTrailingZeroes(fractionString);\r\n\r\n formattedValue = stationString + spec.format.decimalSeparator + fractionString;\r\n } else {\r\n if (isKeepTrailingZeroes)\r\n fractionString = spec.format.decimalSeparator + \"\".padEnd(spec.format.precision, \"0\");\r\n else if (spec.format.hasFormatTraitSet(FormatTraits.KeepDecimalPoint))\r\n fractionString = spec.format.decimalSeparator;\r\n formattedValue = stationString + fractionString;\r\n }\r\n }\r\n\r\n if(spec.format.minWidth) {\r\n formattedValue = this.countAndPad(formattedValue, spec.format.minWidth);\r\n }\r\n\r\n return formattedValue;\r\n }\r\n\r\n private static countAndPad(value: string, minWidth: number): string {\r\n const regex = /[\\d,.]/g;\r\n const matches = value.match(regex);\r\n const count = matches ? matches.length : 0;\r\n if (count < minWidth) {\r\n value = value.padStart(minWidth, \"0\");\r\n }\r\n return value;\r\n }\r\n\r\n /** Format a quantity value into a single text string based on the current format specification of this class.\r\n * @param magnitude defines the value to spec.format.\r\n * @param spec A FormatterSpec object the defines specification for the magnitude and unit conversions for the formatter.\r\n */\r\n public static formatQuantity(magnitude: number, spec: FormatterSpec): string {\r\n const valueIsNegative = magnitude < 0.0;\r\n let prefix = \"\";\r\n let suffix = \"\";\r\n let formattedValue = \"\";\r\n if(spec.format.type === FormatType.Bearing || spec.format.type === FormatType.Azimuth) {\r\n const result = this.processBearingAndAzimuth(magnitude, spec);\r\n magnitude = result.magnitude;\r\n prefix = result.prefix ?? \"\";\r\n suffix = result.suffix ?? \"\";\r\n }\r\n\r\n switch (spec.format.showSignOption) {\r\n case ShowSignOption.NegativeParentheses:\r\n if (valueIsNegative) {\r\n prefix += \"(\";\r\n suffix = `)${suffix}`;\r\n }\r\n break;\r\n\r\n case ShowSignOption.OnlyNegative:\r\n if (valueIsNegative && spec.format.type !== FormatType.Bearing && spec.format.type !== FormatType.Azimuth)\r\n prefix += \"-\";\r\n\r\n break;\r\n\r\n case ShowSignOption.SignAlways:\r\n if (valueIsNegative)\r\n prefix += \"-\";\r\n else\r\n prefix += \"+\";\r\n\r\n break;\r\n\r\n case ShowSignOption.NoSign:\r\n default:\r\n break;\r\n }\r\n\r\n let formattedMagnitude = \"\";\r\n\r\n if (spec.format.hasUnits) {\r\n formattedMagnitude = Formatter.formatComposite(magnitude, spec);\r\n } else {\r\n // unitless quantity\r\n formattedMagnitude = Formatter.formatMagnitude(magnitude, spec);\r\n if (formattedMagnitude.length > 0 && spec.unitConversions.length > 0 && spec.format.hasFormatTraitSet(FormatTraits.ShowUnitLabel)) {\r\n if (spec.format.hasFormatTraitSet(FormatTraits.PrependUnitLabel))\r\n formattedMagnitude = spec.unitConversions[0].label + spec.format.uomSeparator + formattedMagnitude;\r\n else\r\n formattedMagnitude = formattedMagnitude + spec.format.uomSeparator + spec.unitConversions[0].label;\r\n }\r\n }\r\n // add Sign prefix and suffix as necessary\r\n if ((prefix.length > 0 || suffix.length > 0) && formattedMagnitude.length > 0)\r\n formattedValue = prefix + formattedMagnitude + suffix;\r\n else\r\n formattedValue = formattedMagnitude;\r\n\r\n return formattedValue;\r\n }\r\n\r\n private static processBearingAndAzimuth(magnitude: number, spec: FormatterSpec): {magnitude: number, prefix?: string, suffix?: string} {\r\n const type = spec.format.type;\r\n if (type !== FormatType.Bearing && type !== FormatType.Azimuth)\r\n return {magnitude};\r\n\r\n const revolution = this.getRevolution(spec);\r\n magnitude = this.normalizeAngle(magnitude, revolution);\r\n const quarterRevolution = revolution / 4;\r\n\r\n if (type === FormatType.Bearing) {\r\n let quadrant = 0;\r\n while (magnitude > quarterRevolution) {\r\n magnitude -= quarterRevolution;\r\n quadrant++;\r\n }\r\n let prefix, suffix: string;\r\n\r\n // Quadrants are\r\n // 3 0\r\n // 2 1\r\n // For quadrants 1 and 3 we have to subtract the angle from quarterRevolution degrees because they go counter-clockwise\r\n if (quadrant === 1 || quadrant === 3)\r\n magnitude = quarterRevolution - magnitude;\r\n\r\n // TODO: at some point we will want to open this for localization, in the first release it's going to be hard coded\r\n if (quadrant === 0 || quadrant === 3)\r\n prefix = \"N\";\r\n\r\n if (quadrant === 2 || quadrant === 1)\r\n prefix = \"S\";\r\n\r\n if (quadrant === 0 || quadrant === 1)\r\n suffix = \"E\";\r\n\r\n if (quadrant === 3 || quadrant === 2)\r\n suffix = \"W\";\r\n\r\n // special case, if in quadrant 2 and value is very close to quarter revolution (90°), turn prefix to N because N90:00:00W is preferred over S90:00:00W\r\n if (quadrant === 2 && spec.unitConversions.length > 0) {\r\n // To determine if value is small, we need to convert it to the smallest unit presented and use the provided precision on it\r\n const unitConversion = spec.unitConversions[spec.unitConversions.length - 1].conversion;\r\n const smallestFormattedDelta = applyConversion((quarterRevolution - magnitude), unitConversion) + this.FPV_MINTHRESHOLD;\r\n\r\n const precisionScale = Math.pow(10.0, spec.format.precision);\r\n const floor = Math.floor((smallestFormattedDelta) * precisionScale + FPV_ROUNDFACTOR) / precisionScale;\r\n if(floor === 0) {\r\n prefix = \"N\";\r\n }\r\n }\r\n\r\n return {magnitude, prefix, suffix: suffix!};\r\n }\r\n\r\n if (type === FormatType.Azimuth) {\r\n let azimuthBase = 0; // default base is North\r\n if (spec.format.azimuthBase !== undefined) {\r\n if (spec.azimuthBaseConversion === undefined) {\r\n throw new QuantityError(QuantityStatus.MissingRequiredProperty, `Missing azimuth base conversion for interpreting ${spec.name}'s azimuth base.`);\r\n }\r\n const azBaseQuantity: Quantity = new Quantity(spec.format.azimuthBaseUnit, spec.format.azimuthBase);\r\n const azBaseConverted = azBaseQuantity.convertTo(spec.persistenceUnit, spec.azimuthBaseConversion);\r\n if (azBaseConverted === undefined || !azBaseConverted.isValid) {\r\n throw new QuantityError(QuantityStatus.UnsupportedUnit, `Failed to convert azimuth base unit to ${spec.persistenceUnit.name}.`);\r\n }\r\n azimuthBase = this.normalizeAngle(azBaseConverted.magnitude, revolution);\r\n }\r\n\r\n if (azimuthBase === 0.0 && spec.format.azimuthClockwiseOrDefault)\r\n return {magnitude}; // no conversion necessary, the input is already using the result parameters (north base and clockwise)\r\n\r\n // subtract the base from the actual value\r\n magnitude -= azimuthBase;\r\n if (spec.format.azimuthClockwiseOrDefault)\r\n return {magnitude: this.normalizeAngle(magnitude, revolution)};\r\n\r\n // turn it into a counter-clockwise angle\r\n magnitude = revolution - magnitude;\r\n // normalize the result as it may have become negative or exceed the revolution\r\n magnitude = this.normalizeAngle(magnitude, revolution);\r\n }\r\n\r\n return {magnitude};\r\n }\r\n\r\n private static normalizeAngle(magnitude: number, revolution: number): number {\r\n magnitude = magnitude % revolution; // Strip anything that goes around more than once\r\n\r\n if (magnitude < 0) // If the value is negative, we want to normalize it to a positive angle\r\n magnitude += revolution;\r\n\r\n return magnitude;\r\n }\r\n\r\n private static getRevolution(spec: FormatterSpec): number {\r\n if (spec.revolutionConversion === undefined) {\r\n throw new QuantityError(QuantityStatus.MissingRequiredProperty, `Missing revolution unit conversion for calculating ${spec.name}'s revolution.`);\r\n }\r\n\r\n const revolution: Quantity = new Quantity(spec.format.revolutionUnit, 1.0);\r\n const converted = revolution.convertTo(spec.persistenceUnit, spec.revolutionConversion);\r\n if (converted === undefined || !converted.isValid) {\r\n throw new QuantityError(QuantityStatus.UnsupportedUnit, `Failed to convert revolution unit to ${spec.persistenceUnit.name}.`);\r\n }\r\n\r\n return converted.magnitude;\r\n }\r\n\r\n private static formatRatio(magnitude: number, spec: FormatterSpec): string {\r\n if (null === spec.format.ratioType)\r\n throw new QuantityError(QuantityStatus.InvalidCompositeFormat, `The Format ${spec.format.name} must have a ratio type specified.`);\r\n\r\n const precisionScale = Math.pow(10.0, spec.format.precision);\r\n\r\n let reciprocal = 0;\r\n\r\n if (magnitude === 0.0)\r\n return \"0:1\";\r\n else\r\n reciprocal = 1.0/magnitude;\r\n\r\n switch (spec.format.ratioType) {\r\n case RatioType.OneToN:\r\n return `1:${this.formatMagnitude(reciprocal, spec)}`;\r\n case RatioType.NToOne:\r\n return `${this.formatMagnitude(magnitude, spec)}:1`;\r\n case RatioType.ValueBased:\r\n if (magnitude > 1.0)\r\n return `${this.formatMagnitude(magnitude, spec)}:1`;\r\n else\r\n return `1:${this.formatMagnitude(reciprocal, spec)}`;\r\n case RatioType.UseGreatestCommonDivisor:\r\n magnitude = Math.round(magnitude * precisionScale)/precisionScale;\r\n let numerator = magnitude * precisionScale;\r\n let denominator = precisionScale;\r\n\r\n const gcd = FractionalNumeric.getGreatestCommonFactor(numerator, denominator);\r\n numerator /= gcd;\r\n denominator /= gcd;\r\n\r\n return `${this.formatMagnitude(numerator, spec)}:${this.formatMagnitude(denominator, spec)}`;\r\n default:\r\n throw new QuantityError(QuantityStatus.InvalidCompositeFormat, `The Format ${spec.format.name} has an invalid ratio type specified.`);\r\n }\r\n }\r\n}\r\n"]}
|