UNPKG

money-lib

Version:

TypeScript library to work with money

63 lines (47 loc) 1.81 kB
import * as money from "../core"; import type { Money } from "../types"; import type { ChainedMoneyV2, MoneyV2 } from "./types"; import { symbolChain } from "./types"; import { config } from "../config"; export const isMoneyChain = <CC extends string, CS extends string>( m: any ): m is ChainedMoneyV2<CC, CS> => { return typeof m === "object" && m !== null && symbolChain in m; }; export const parseMoneyInput = <CC extends string, CS extends string>( input?: MoneyV2<CC, CS> | ChainedMoneyV2<CC, CS> ): Money => { if (input === undefined || input === null) { return { amount: 0, currency: config.defaultCurrency }; } if (typeof input === "object" && "cents" in input && "currency" in input) { return money.fromInt(input.cents, input.currency); } if (typeof input === "object" && "decimal" in input && "currency" in input) { return money.fromFloat(input.decimal, input.currency); } if (typeof input === "number") { return money.fromFloat(input, config.defaultCurrency); } if (isMoneyChain<CC, CS>(input)) { return input.json(); } if (money.isValid(input)) { return input; } let stringInput = input.trim().toLocaleUpperCase(); const hasCents = stringInput.includes("CENTS"); stringInput = stringInput.replace("CENTS", ""); const amount = parseFloat( stringInput .replace(/,/g, ".") // treat comma as decimal separator .replace(/[^-0-9.]/g, "") // remove non-number related ) || 0; const currencies = Object.values(config.currencies); const currency = currencies.find((c) => stringInput.startsWith(c.symbol)) || currencies.find((c) => stringInput.endsWith(c.code)); const from = hasCents ? money.fromInt : money.fromFloat; return from(amount, currency?.code ?? config.defaultCurrency); };