From 70993ef385044866fe17d4899d552c87a1ea6452 Mon Sep 17 00:00:00 2001 From: Lai Weng Han Date: Thu, 16 Apr 2020 13:18:31 +0800 Subject: [PATCH 1/2] add formatLargeValueCurrency --- src/index.d.ts | 15 ++++++++++++++- src/index.js | 49 ++++++++++++++++++++++++++++++++++++++++++------- src/test.js | 43 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 99 insertions(+), 8 deletions(-) diff --git a/src/index.d.ts b/src/index.d.ts index ad6d31e..0775848 100644 --- a/src/index.d.ts +++ b/src/index.d.ts @@ -15,5 +15,18 @@ export function formatCurrency( amount: number, isoCode: string, locale: string, - raw: boolean + raw: false +): string; +export function formatCurrency( + amount: number, + isoCode: string, + locale: string, + raw: true +): number; + +// format large value currency +export function formatLargeValueCurrency( + amount: number, + isoCode: string, + locale?: string ): string; diff --git a/src/index.js b/src/index.js index 3017d06..08c1142 100644 --- a/src/index.js +++ b/src/index.js @@ -41,7 +41,7 @@ const supportedCurrencySymbols = { TRY: "₺", XAU: "XAU", XAG: "XAG", - XDR: "XDR" + XDR: "XDR", }; // A map of override objects to apply. @@ -52,7 +52,7 @@ const symbolOverrides = { SGD: { location: { start: true }, forLocales: { en: true } }, PHP: { location: { start: true }, forLocales: { en: true } }, BTC: { location: { start: true }, forLocales: { en: true } }, - ETH: { location: { start: true }, forLocales: { en: true } } + ETH: { location: { start: true }, forLocales: { en: true } }, }; // Feature detection for Intl.NumberFormat @@ -125,7 +125,7 @@ function generateIntlNumberFormatter(isoCode, locale, numDecimals) { currency: isoCode, currencyDisplay: "symbol", minimumFractionDigits: numDecimals, - maximumFractionDigits: numDecimals + maximumFractionDigits: numDecimals, }); } catch (e) { // Unsupported currency, etc. @@ -141,19 +141,19 @@ function generateFallbackFormatter(isoCode, locale, numDecimals = 2) { if (numDecimals > 2) { return { - format: value => { + format: (value) => { return isCrypto(isoCode) ? `${value.toFixed(numDecimals)} ${isoCode}` : `${isoCode} ${value.toFixed(numDecimals)}`; - } + }, }; } else { return { - format: value => { + format: (value) => { return isCrypto(isoCode) ? `${value.toLocaleString(locale)} ${isoCode}` : `${isoCode} ${value.toLocaleString(locale)}`; - } + }, }; } } @@ -331,3 +331,38 @@ export function formatCurrency(amount, isoCode, locale = "en", raw = false) { } } } + +export function formatLargeValueCurrency(amount, isoCode, locale = "en") { + isoCode = isoCode.toUpperCase(); + const formattedAmount = formatNumber(amount); + if (isCrypto(isoCode)) { + const formatted = Number.parseFloat(formattedAmount.value).toFixed(3); + return isBTCETH(isoCode) + ? supportedCurrencySymbols[isoCode] + formatted + formattedAmount.append + : formatted + formattedAmount.append + " " + isoCode; + } else { + const formatted = formatCurrency(formattedAmount.value, isoCode, locale); + return formatted + formattedAmount.append; + } +} + +function formatNumber(val) { + if (Math.abs(Number(val)) >= 1.0e9) { + return { + append: "B", + value: Math.abs(Number(val)) / 1.0e9, + }; + } else if (Math.abs(Number(val)) >= 1.0e6) { + return { + append: "M", + value: Math.abs(Number(val)) / 1.0e6, + }; + } else if (Math.abs(Number(val)) >= 1.0e3) { + return { + append: "K", + value: Math.abs(Number(val)) / 1.0e3, + }; + } else { + return { append: "", value: val }; + } +} diff --git a/src/test.js b/src/test.js index d48ee31..da60dc1 100644 --- a/src/test.js +++ b/src/test.js @@ -1,4 +1,5 @@ import { formatCurrency, isCrypto, clearCache } from "./index"; +import { formatLargeValueCurrency } from "."; test("isCrypto", () => { expect(isCrypto("BTC")).toBe(true); @@ -166,3 +167,45 @@ describe("Format Currency correctly", () => { expect(formatCurrency(32.034, "JPY", "en")).toEqual("¥32.03"); }); }); + +describe("Format large value currency", () => { + beforeAll(() => { + clearCache(); + }); + + it("Formats thousands", () => { + expect(formatLargeValueCurrency(1234.02, "USD", "en")).toEqual("$1.23K"); + expect(formatLargeValueCurrency(11234.02, "JPY", "en")).toEqual("¥11.23K"); + expect(formatLargeValueCurrency(1234.5, "PHP", "en")).toEqual("₱1.23K"); + expect(formatLargeValueCurrency(1234, "DOGE", "en")).toEqual("1.234K DOGE"); + expect(formatLargeValueCurrency(1234, "BTC", "en")).toEqual("₿1.234K"); + }); + + it("Formats millions", () => { + expect(formatLargeValueCurrency(1234567.02, "USD", "en")).toEqual("$1.23M"); + expect(formatLargeValueCurrency(11234567.02, "JPY", "en")).toEqual( + "¥11.23M" + ); + expect(formatLargeValueCurrency(1234567, "PHP", "en")).toEqual("₱1.23M"); + expect(formatLargeValueCurrency(1234567, "DOGE", "en")).toEqual( + "1.235M DOGE" + ); + expect(formatLargeValueCurrency(1234567, "BTC", "en")).toEqual("₿1.235M"); + }); + + it("Formats billions", () => { + expect(formatLargeValueCurrency(1234567890.02, "USD", "en")).toEqual( + "$1.23B" + ); + expect(formatLargeValueCurrency(11234567890.02, "JPY", "en")).toEqual( + "¥11.23B" + ); + expect(formatLargeValueCurrency(1234567890, "PHP", "en")).toEqual("₱1.23B"); + expect(formatLargeValueCurrency(1234567890, "DOGE", "en")).toEqual( + "1.235B DOGE" + ); + expect(formatLargeValueCurrency(1234567890, "BTC", "en")).toEqual( + "₿1.235B" + ); + }); +}); From 6b53505ce87b4ef66f27356b29f3e5fea97cb0f6 Mon Sep 17 00:00:00 2001 From: Lai Weng Han Date: Thu, 16 Apr 2020 13:22:04 +0800 Subject: [PATCH 2/2] rename append to suffix --- src/index.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/index.js b/src/index.js index 08c1142..f50b086 100644 --- a/src/index.js +++ b/src/index.js @@ -338,31 +338,31 @@ export function formatLargeValueCurrency(amount, isoCode, locale = "en") { if (isCrypto(isoCode)) { const formatted = Number.parseFloat(formattedAmount.value).toFixed(3); return isBTCETH(isoCode) - ? supportedCurrencySymbols[isoCode] + formatted + formattedAmount.append - : formatted + formattedAmount.append + " " + isoCode; + ? supportedCurrencySymbols[isoCode] + formatted + formattedAmount.suffix + : formatted + formattedAmount.suffix + " " + isoCode; } else { const formatted = formatCurrency(formattedAmount.value, isoCode, locale); - return formatted + formattedAmount.append; + return formatted + formattedAmount.suffix; } } function formatNumber(val) { if (Math.abs(Number(val)) >= 1.0e9) { return { - append: "B", + suffix: "B", value: Math.abs(Number(val)) / 1.0e9, }; } else if (Math.abs(Number(val)) >= 1.0e6) { return { - append: "M", + suffix: "M", value: Math.abs(Number(val)) / 1.0e6, }; } else if (Math.abs(Number(val)) >= 1.0e3) { return { - append: "K", + suffix: "K", value: Math.abs(Number(val)) / 1.0e3, }; } else { - return { append: "", value: val }; + return { suffix: "", value: val }; } }