@prefect9/num
Version:
UI number formats
144 lines (114 loc) • 4.2 kB
JavaScript
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