import slug from 'slug'; const capitalize = (value: string) => value.toString().charAt(0).toUpperCase() + value.substring(1, value.length).toLowerCase(); const pluralize = (singular: string, plural: string, count: number) => (count === 1 ? singular : plural); const lowerCaseTrim = (value: string) => value.toLowerCase().trim(); /** * Parses to an integer. */ const unmaskNumber = (maskedValue: string): number => { maskedValue = maskedValue.replace(/\./g, '').replace(/[,]/g, ''); return parseInt(maskedValue, 10); }; /** * Pass in number n and get the ordinals added to it as a string. * For example: 1 -> 1st, 2-> 2nd, 3 -> 3rd, etc * Also works for negative numbers. */ const addNumberOrdinals = (n: number): string => { const s = ['th', 'st', 'nd', 'rd']; const v = n % 100; return n + ((s[(v - 20) % 10] ?? s[v] ?? s[0]) || ''); }; /** * Passed in string must be a valid int or float and * a condenese format will be returned like 1.2M or 500K */ const condenseNumber = (number: string | number, digits = 1): string => { number = parseInt(number.toString(), 10); const lookup = [ { value: 1, symbol: '' }, { value: 1e3, symbol: 'k' }, { value: 1e6, symbol: 'M' }, { value: 1e9, symbol: 'G' }, { value: 1e12, symbol: 'T' }, { value: 1e15, symbol: 'P' }, { value: 1e18, symbol: 'E' }, ]; const rx = /\.0+$|(\.[0-9]*[1-9])0+$/; const item = lookup.slice().reverse().find((item) => { return number as number >= item.value; }); return item ? (number / item.value).toFixed(digits).replace(rx, '$1') + item.symbol : '0'; }; const StringUtil = { capitalize, pluralize, lowerCaseTrim, slug, unmaskNumber, condenseNumber, addNumberOrdinals, }; export default StringUtil;