From f37ed5a719e503afa4588d0388245166d440a158 Mon Sep 17 00:00:00 2001 From: Orlando Date: Mon, 29 Jan 2024 13:40:21 +0000 Subject: [PATCH] Format percentage --- CHANGELOG.md | 6 ++++++ README.md | 4 +++- package.json | 2 +- src/formatters/formatNumber.test.ts | 13 +++++++++++++ src/formatters/formatNumber.ts | 12 ++++++++++++ src/helpers/index.ts | 2 ++ 6 files changed, 37 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f2cc543..7ad7590 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # deverything +## 0.42.1 + +### Patch Changes + +- format percentage + ## 0.42.0 ### Minor Changes diff --git a/README.md b/README.md index 5df2800..beecec2 100644 --- a/README.md +++ b/README.md @@ -66,6 +66,8 @@ Contributions always welcome! - `capitalize()` word => Word - `cleanSpaces()` trims and turns double spaces into single space - `clamp()` clamp number in a range +- `enumKeys()` enum FRUIT { APPLE, PEAR } => ["APPLE", "PEAR"] +- `enumValues()` enum FRUIT { APPLE = 1, PEAR = 3 } => [1, 3] - `first()` get the first element of an array - `firstKey()` - `firstValue()` @@ -96,7 +98,7 @@ Contributions always welcome! ### Formatters -- `formatNumber()` 1000 => "1,000" or "1K" +- `formatNumber()` 1000 => "1,000" or "1K" or 0.112 => "11.2%" - `stringToUnicode()` "hello" => "\u0068\u0065\u006c\u006c\u006f" - `stringToCSSUnicode()` "hello" => "\000068\000065\00006c\00006c\00006f" use this for CSS diff --git a/package.json b/package.json index 690aed0..12f69dd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "deverything", - "version": "0.42.0", + "version": "0.42.1", "description": "Everything you need for Dev", "main": "./dist/index.js", "module": "./dist/index.mjs", diff --git a/src/formatters/formatNumber.test.ts b/src/formatters/formatNumber.test.ts index 8cd1bc7..94cd254 100644 --- a/src/formatters/formatNumber.test.ts +++ b/src/formatters/formatNumber.test.ts @@ -28,4 +28,17 @@ describe("formatNumber", () => { const formattedValue = formatNumber(123456.123456); expect(formattedValue).toEqual("123,456.123"); }); + + test("Percentage no digits", () => { + const formattedValue = formatNumber(0.123456, { percentage: true }); + expect(formattedValue).toEqual("12%"); + }); + + test("Percentage digits", () => { + const formattedValue = formatNumber(0.123456, { + percentage: true, + maxDigits: 2, + }); + expect(formattedValue).toEqual("12.35%"); + }); }); diff --git a/src/formatters/formatNumber.ts b/src/formatters/formatNumber.ts index a1b7212..c067c18 100644 --- a/src/formatters/formatNumber.ts +++ b/src/formatters/formatNumber.ts @@ -1,22 +1,34 @@ +import { isNumber } from "../validators/isNumber"; + /** * * @example formatNumber(1000, { compact: true }) // 1K * @example formatNumber(1111, { maxDigits: 2 }) // 1,100 * @example formatNumber(111111.123123123) // 111,111.123 + * @example formatNumber(0.12345, { percentage: true, maxDigits: 2 }) // '12.34%' */ export const formatNumber = ( value: number, { compact, maxDigits, + percentage, }: { compact?: boolean; maxDigits?: number; + percentage?: boolean; } = {} ): string => { + if (percentage) { + const useValue = isNumber(value) ? value : 0; + const number = Number((useValue * 100).toFixed(maxDigits || 0)); + return `${number}%`; + } + const formatter = Intl.NumberFormat("en", { notation: compact ? "compact" : "standard", maximumSignificantDigits: maxDigits, }); + return formatter.format(value); }; diff --git a/src/helpers/index.ts b/src/helpers/index.ts index 4c316e1..9efcc06 100644 --- a/src/helpers/index.ts +++ b/src/helpers/index.ts @@ -5,6 +5,8 @@ export * from "./capitalize"; export * from "./clamp"; export * from "./cleanSpaces"; export * from "./dir"; +export * from "./enumKeys"; +export * from "./enumValues"; export * from "./first"; export * from "./firstKey"; export * from "./firstValue";