diff options
Diffstat (limited to 'packages/taler-util/src/amounts.ts')
-rw-r--r-- | packages/taler-util/src/amounts.ts | 86 |
1 files changed, 52 insertions, 34 deletions
diff --git a/packages/taler-util/src/amounts.ts b/packages/taler-util/src/amounts.ts index 3750cf61f..c3770a393 100644 --- a/packages/taler-util/src/amounts.ts +++ b/packages/taler-util/src/amounts.ts @@ -53,7 +53,7 @@ export const amountMaxValue = 2 ** 52; /** * Separator character between integer and fractional */ -export const FRAC_SEPARATOR = "." +export const FRAC_SEPARATOR = "."; /** * Non-negative financial amount. Fractional values are expressed as multiples @@ -370,7 +370,7 @@ export class Amounts { /** * Parse an amount like 'EUR:20.5' for 20 Euros and 50 ct. - * + * * Currency name size limit is 11 of ASCII letters * Fraction size limit is 8 */ @@ -379,7 +379,7 @@ export class Amounts { if (!res) { return undefined; } - const tail = res[3] || (FRAC_SEPARATOR + "0"); + const tail = res[3] || FRAC_SEPARATOR + "0"; if (tail.length > amountFractionalLength + 1) { return undefined; } @@ -550,58 +550,76 @@ export class Amounts { return amountFractionalLength - i + 1; } - - static stringifyValueWithSpec(value: AmountJson, spec: CurrencySpecification): { currency: string, normal: string, small?: string } { - const strValue = Amounts.stringifyValue(value) - const pos = strValue.indexOf(FRAC_SEPARATOR) + static stringifyValueWithSpec( + value: AmountJson, + spec: CurrencySpecification, + ): { currency: string; normal: string; small?: string } { + const strValue = Amounts.stringifyValue(value); + const pos = strValue.indexOf(FRAC_SEPARATOR); const originalPosition = pos < 0 ? strValue.length : pos; - let currency = value.currency - const names = Object.keys(spec.alt_unit_names) - let FRAC_POS_NEW_POSITION = originalPosition + let currency = value.currency; + const names = Object.keys(spec.alt_unit_names); + let FRAC_POS_NEW_POSITION = originalPosition; //find symbol //FIXME: this should be based on a cache to speed up if (names.length > 0) { - let unitIndex: string = "0" //default entry by DD51 - names.forEach(index => { - const i = Number.parseInt(index, 10) + let unitIndex: string = "0"; //default entry by DD51 + names.forEach((index) => { + const i = Number.parseInt(index, 10); if (Number.isNaN(i)) return; //skip if (originalPosition - i <= 0) return; //too big if (originalPosition - i < FRAC_POS_NEW_POSITION) { FRAC_POS_NEW_POSITION = originalPosition - i; - unitIndex = index + unitIndex = index; } - }) - currency = spec.alt_unit_names[unitIndex] + }); + currency = spec.alt_unit_names[unitIndex]; } if (originalPosition === FRAC_POS_NEW_POSITION) { - const { normal, small } = splitNormalAndSmall(strValue, originalPosition, spec) - return { currency, normal, small } + const { normal, small } = splitNormalAndSmall( + strValue, + originalPosition, + spec, + ); + return { currency, normal, small }; } - const intPart = strValue.substring(0, originalPosition) - const fracPArt = strValue.substring(originalPosition + 1) + const intPart = strValue.substring(0, originalPosition); + const fracPArt = strValue.substring(originalPosition + 1); //indexSize is always smaller than originalPosition - const newValue = intPart.substring(0, FRAC_POS_NEW_POSITION) + FRAC_SEPARATOR + intPart.substring(FRAC_POS_NEW_POSITION) + fracPArt - const { normal, small } = splitNormalAndSmall(newValue, FRAC_POS_NEW_POSITION, spec) - return { currency, normal, small } + const newValue = + intPart.substring(0, FRAC_POS_NEW_POSITION) + + FRAC_SEPARATOR + + intPart.substring(FRAC_POS_NEW_POSITION) + + fracPArt; + const { normal, small } = splitNormalAndSmall( + newValue, + FRAC_POS_NEW_POSITION, + spec, + ); + return { currency, normal, small }; } - - } -function splitNormalAndSmall(decimal: string, fracSeparatorIndex: number, spec: CurrencySpecification): { normal: string, small?: string } { +function splitNormalAndSmall( + decimal: string, + fracSeparatorIndex: number, + spec: CurrencySpecification, +): { normal: string; small?: string } { let normal: string; let small: string | undefined; - if (decimal.length - fracSeparatorIndex - 1 > spec.num_fractional_normal_digits) { - const limit = fracSeparatorIndex + spec.num_fractional_normal_digits + 1 - normal = decimal.substring(0, limit) - small = decimal.substring(limit) + if ( + decimal.length - fracSeparatorIndex - 1 > + spec.num_fractional_normal_digits + ) { + const limit = fracSeparatorIndex + spec.num_fractional_normal_digits + 1; + normal = decimal.substring(0, limit); + small = decimal.substring(limit); } else { - normal = decimal - small = undefined + normal = decimal; + small = undefined; } - return { normal, small } + return { normal, small }; } - |