Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 | 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 94x 94x 94x 94x 94x 94x 94x 94x 94x 94x 94x 94x 94x 94x 94x 94x 94x 94x 94x | import { d3Format } from "./Util"
export interface TickFormattingOptions {
numDecimalPlaces?: number
unit?: string
noTrailingZeroes?: boolean
noSpaceUnit?: boolean
numberPrefixes?: boolean
shortNumberPrefixes?: boolean
showPlus?: boolean
}
// todo: Should this be numberSuffixes instead of Prefixes?
// todo: we should have unit tests for this one. lot's of great features but hard to see how to use all of them.
export function formatValue(
value: number,
options: TickFormattingOptions
): string {
const noTrailingZeroes = options.noTrailingZeroes ?? true
const numberPrefixes =
(options.numberPrefixes || options.shortNumberPrefixes) ?? true
const shortNumberPrefixes = options.shortNumberPrefixes ?? false
const showPlus = options.showPlus ?? false
const numDecimalPlaces = options.numDecimalPlaces ?? 2
const unit = options.unit ?? ""
const isNoSpaceUnit = options.noSpaceUnit ?? unit[0] === "%"
let output: string = value.toString()
const absValue = Math.abs(value)
if (!isNoSpaceUnit && numberPrefixes && absValue >= 1e6) {
if (!isFinite(absValue)) output = "Infinity"
else if (absValue >= 1e12)
output = formatValue(value / 1e12, {
...options,
unit: shortNumberPrefixes ? "T" : "trillion",
noSpaceUnit: shortNumberPrefixes,
numDecimalPlaces: 2,
})
else if (absValue >= 1e9)
output = formatValue(value / 1e9, {
...options,
unit: shortNumberPrefixes ? "B" : "billion",
noSpaceUnit: shortNumberPrefixes,
numDecimalPlaces: 2,
})
else if (absValue >= 1e6)
output = formatValue(value / 1e6, {
...options,
unit: shortNumberPrefixes ? "M" : "million",
noSpaceUnit: shortNumberPrefixes,
numDecimalPlaces: 2,
})
} else if (!isNoSpaceUnit && shortNumberPrefixes && absValue >= 1e3) {
output = formatValue(value / 1e3, {
...options,
unit: "k",
noSpaceUnit: true,
numDecimalPlaces: 2,
})
} else {
const targetDigits = Math.pow(10, -numDecimalPlaces)
if (value !== 0 && Math.abs(value) < targetDigits) {
if (value < 0) output = `>-${targetDigits}`
else output = `<${targetDigits}`
} else
output = d3Format(`${showPlus ? "+" : ""},.${numDecimalPlaces}f`)(
value
)
if (noTrailingZeroes) {
// Convert e.g. 2.200 to 2.2
const m = output.match(/(.*?[0-9,-]+.[0-9,]*?)0*$/)
if (m) output = m[1]
if (output[output.length - 1] === ".")
output = output.slice(0, output.length - 1)
}
}
if (unit === "$" || unit === "£") output = unit + output
else if (isNoSpaceUnit) output = output + unit
else if (unit.length > 0) output = output + " " + unit
return output
}
|