in src/formattingService/formattingService.ts [863:917]
export function getCustomFormatMetadata(format: string, calculatePrecision?: boolean, calculateScale?: boolean, calculatePartsPerScale?: boolean): NumericFormatMetadata {
if (_lastCustomFormatMeta !== undefined && format === _lastCustomFormatMeta.format) {
return _lastCustomFormatMeta;
}
let literals: string[] = [];
let escaped = formattingEncoder.preserveLiterals(format, literals);
let result: NumericFormatMetadata = {
format: format,
hasLiterals: literals.length !== 0,
hasE: false,
hasCommas: false,
hasDots: false,
hasPercent: false,
hasPermile: false,
precision: undefined,
scale: undefined,
partsPerScale: undefined,
};
for (let i = 0, length = escaped.length; i < length; i++) {
let c = escaped.charAt(i);
switch (c) {
case "e":
case "E":
result.hasE = true;
break;
case ",":
result.hasCommas = true;
break;
case ".":
result.hasDots = true;
break;
case "%":
result.hasPercent = true;
break;
case "\u2030": // ‰
result.hasPermile = true;
break;
}
}
// Use positive format for calculating these values
let formatComponents = getComponents(format);
if (calculatePrecision)
result.precision = getCustomFormatPrecision(formatComponents.positive, result);
if (calculatePartsPerScale)
result.partsPerScale = getCustomFormatPartsPerScale(formatComponents.positive, result);
if (calculateScale)
result.scale = getCustomFormatScale(formatComponents.positive, result);
return result;
}