UNPKG

@prefect9/num

Version:

UI number formats

144 lines (114 loc) 4.2 kB
function _interface(value, requiredDecimals=true){ value = parseFloat(value) if(!isFinite(value)) throw new Error('Value is not number') let isMinus = value < 0 value = Math.abs(value) let beforeDot = parseInt(value) const beforeDotParts = [] do{ if(beforeDotParts.length){ let previousPart = beforeDotParts[0] const previousPartLength = previousPart.length for(let i = 0; i < 3-previousPartLength; i++) previousPart = `0${previousPart}` beforeDotParts[0] = previousPart } const part = beforeDot % 1000 beforeDot = parseInt(beforeDot / 1000) beforeDotParts.unshift(`${part}`) }while(beforeDot > 0) let afterDot = parseInt(value * 100) % 100 afterDot = `${afterDot <= 9 ? '0' : ''}${afterDot}` return `${isMinus ? '-' : ''}${beforeDotParts.join('\'')}${requiredDecimals || afterDot !== '00' ? `.${afterDot}` : ''}` } exports.interface = _interface function parseAmount(value) { value = parseFloat(value) if(!isFinite(value)) throw new Error('Value must be valid number') let negative = value < 0 value = Math.abs(value) let beforeDot = parseInt(value) let afterDot = parseInt(value * 100) % 100 afterDot = `${afterDot}` if(afterDot.length < 2) afterDot = `0${afterDot}` return [`${beforeDot}`, afterDot, negative] } exports.parseAmount = parseAmount function toAmount(value, isNum=false){ const [beforeDot, afterDot, negative] = parseAmount(value) if(isNum) return parseFloat(`${negative ? '-' : ''}${beforeDot}.${afterDot}`) return `${negative ? '-' : ''}${beforeDot}.${afterDot}` } exports.toAmount = toAmount exports.toRoundedAmount = (value, isNum=false) => { value = parseFloat(value) if(!isFinite(value)) throw new Error('Argument must be a number') value = value*100 let remainder = value - parseInt(value) if(remainder > 0) value = parseInt(value + 1) else value = parseInt(value) if(isNum) return value/100 return toAmount(value/100) } const formatted = (value, requiredAfterDot=true) => { value = parseFloat(value) let isNegative = false if(value < 0) isNegative = true value = Math.abs(value) let beforeDot = parseInt(value) const beforeDotSections = [] while(beforeDot > 0){ beforeDotSections.unshift(`${beforeDot%1000}`) beforeDot = parseInt(beforeDot/1000) } if(!beforeDotSections.length) beforeDotSections.push('0') for(let i = 1; i < beforeDotSections.length; i++){ let value = beforeDotSections[i] if(value.length === 1) value = `00${value}` if(value.length === 2) value = `0${value}` beforeDotSections[i] = value } let afterDot = `${Math.round((value*100)%100)}` if(afterDot.length === 1) afterDot = `0${afterDot}` if(!requiredAfterDot && afterDot === '00') afterDot = '' const result = [beforeDotSections.join('\'')] if(afterDot.length) result.push(afterDot) return `${isNegative?'-':''}${result.join('.')}` } exports.formatted = formatted const approximately = value => { const realValue = value value = parseFloat(value) let isNegative = false if(value < 0) isNegative = true value = Math.abs(value) if(value >= 1000000){ let beforeDot = parseInt(value/1000000) let afterDot = `${Math.round((value%1000000)/1000)}` if(afterDot === '1000'){ beforeDot = `${parseInt(beforeDot)+1}` afterDot = '0' } if(afterDot.length === 1) afterDot = `00${afterDot}` if(afterDot.length === 2) afterDot = `0${afterDot}` if(afterDot === '000') afterDot = '' else if(afterDot.substr(1,2) === '00') afterDot = afterDot[0] else if(afterDot[2] === '0') afterDot = afterDot.substr(0,2) const result = [beforeDot] if(afterDot.length) result.push(afterDot) return `${isNegative?'-':''}${result.join('.')}M` }else if(value >= 1000){ let beforeDot = parseInt(value/1000) let afterDot = `${Math.round((value%1000)/10)}` if(afterDot === '100'){ beforeDot = `${parseInt(beforeDot)+1}` afterDot = '0' } if(afterDot.length === 1) afterDot = `0${afterDot}` if(afterDot === '00') afterDot = '' else if(afterDot[1] === '0') afterDot = afterDot[0] const result = [beforeDot] if(afterDot.length) result.push(afterDot) return `${isNegative?'-':''}${result.join('.')}K` }else return formatted(realValue, false) } exports.apr = approximately