74 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			74 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
import { ENV_CONFIG } from '../envs/constants'
 | 
						|
 | 
						|
const formatter = new Intl.NumberFormat('en-US', {
 | 
						|
  style: 'currency',
 | 
						|
  currency: 'USD',
 | 
						|
  maximumFractionDigits: 0,
 | 
						|
  minimumFractionDigits: 0,
 | 
						|
})
 | 
						|
 | 
						|
export function formatMoney(amount: number) {
 | 
						|
  const newAmount = Math.round(amount) === 0 ? 0 : Math.floor(amount) // handle -0 case
 | 
						|
  return ENV_CONFIG.moneyMoniker + formatter.format(newAmount).replace('$', '')
 | 
						|
}
 | 
						|
 | 
						|
export function formatMoneyWithDecimals(amount: number) {
 | 
						|
  return ENV_CONFIG.moneyMoniker + amount.toFixed(2)
 | 
						|
}
 | 
						|
 | 
						|
export function capitalFirst(s: string) {
 | 
						|
  return s.charAt(0).toUpperCase() + s.slice(1)
 | 
						|
}
 | 
						|
 | 
						|
export function formatWithCommas(amount: number) {
 | 
						|
  return formatter.format(Math.floor(amount)).replace('$', '')
 | 
						|
}
 | 
						|
 | 
						|
export function manaToUSD(mana: number) {
 | 
						|
  return (mana / 100).toLocaleString('en-US', {
 | 
						|
    style: 'currency',
 | 
						|
    currency: 'USD',
 | 
						|
  })
 | 
						|
}
 | 
						|
 | 
						|
export function formatPercent(zeroToOne: number) {
 | 
						|
  // Show 1 decimal place if <2% or >98%, giving more resolution on the tails
 | 
						|
  const decimalPlaces = zeroToOne < 0.02 || zeroToOne > 0.98 ? 1 : 0
 | 
						|
  return (zeroToOne * 100).toFixed(decimalPlaces) + '%'
 | 
						|
}
 | 
						|
 | 
						|
const showPrecision = (x: number, sigfigs: number) =>
 | 
						|
  // convert back to number for weird formatting reason
 | 
						|
  `${Number(x.toPrecision(sigfigs))}`
 | 
						|
 | 
						|
// Eg 1234567.89 => 1.23M; 5678 => 5.68K
 | 
						|
export function formatLargeNumber(num: number, sigfigs = 2): string {
 | 
						|
  const absNum = Math.abs(num)
 | 
						|
  if (absNum < 1) return showPrecision(num, sigfigs)
 | 
						|
 | 
						|
  if (absNum < 100) return showPrecision(num, 2)
 | 
						|
  if (absNum < 1000) return showPrecision(num, 3)
 | 
						|
  if (absNum < 10000) return showPrecision(num, 4)
 | 
						|
 | 
						|
  const suffix = ['', 'K', 'M', 'B', 'T', 'Q']
 | 
						|
  const i = Math.floor(Math.log10(absNum) / 3)
 | 
						|
 | 
						|
  const numStr = showPrecision(num / Math.pow(10, 3 * i), sigfigs)
 | 
						|
  return `${numStr}${suffix[i] ?? ''}`
 | 
						|
}
 | 
						|
 | 
						|
export function toCamelCase(words: string) {
 | 
						|
  const camelCase = words
 | 
						|
    .split(' ')
 | 
						|
    .map((word) => word.trim())
 | 
						|
    .filter((word) => word)
 | 
						|
    .map((word, index) =>
 | 
						|
      index === 0 ? word : word[0].toLocaleUpperCase() + word.substring(1)
 | 
						|
    )
 | 
						|
    .join('')
 | 
						|
 | 
						|
  // Remove non-alpha-numeric-underscore chars.
 | 
						|
  const regex = /(?:^|\s)(?:[a-z0-9_]+)/gi
 | 
						|
  return (camelCase.match(regex) || [])[0] ?? ''
 | 
						|
}
 |