From fa37da66ff126d8c58bf23320bb156588548754e Mon Sep 17 00:00:00 2001 From: Sam Nolan Date: Tue, 15 Feb 2022 11:38:36 +1100 Subject: [PATCH] Add number shower to SquiggleChart --- .../components/src/stories/SquiggleChart.tsx | 92 ++++++++++++++++++- 1 file changed, 90 insertions(+), 2 deletions(-) diff --git a/packages/components/src/stories/SquiggleChart.tsx b/packages/components/src/stories/SquiggleChart.tsx index bfa08362..471cc2d4 100644 --- a/packages/components/src/stories/SquiggleChart.tsx +++ b/packages/components/src/stories/SquiggleChart.tsx @@ -139,12 +139,12 @@ let SquiggleVegaChart = createClassFromSpec({'spec': specification}); * Primary UI component for user interaction */ export const SquiggleChart = ({ squiggleString }: { squiggleString: string}) => { + let result = run(squiggleString); - console.log(result); if (result.tag === "Ok") { let chartResult = result.value[0]; if(chartResult["NAME"] === "Float"){ - return
{chartResult["VAL"]}
; + return ; } else if(chartResult["NAME"] === "DistPlus"){ let shape = chartResult.VAL.shape; @@ -258,3 +258,91 @@ squggleString: "normal(5, 2)" }; + +function MakeNumberShower(props: {number: number, precision :number}){ + let numberWithPresentation = numberShow(props.number, props.precision); + return ( + + {numberWithPresentation.value} + {numberWithPresentation.symbol} + {numberWithPresentation.power ? + + {'\u00b710'} + + {numberWithPresentation.power} + + + : <>} + + + ); + +} + +const orderOfMagnitudeNum = (n:number) => { + return Math.pow(10, n); +}; + +// 105 -> 3 +const orderOfMagnitude = (n:number) => { + return Math.floor(Math.log(n) / Math.LN10 + 0.000000001); +}; + +function withXSigFigs(number:number, sigFigs:number) { + const withPrecision = number.toPrecision(sigFigs); + const formatted = Number(withPrecision); + return `${formatted}`; +} + +class NumberShower { + number: number + precision: number + + constructor(number:number, precision = 2) { + this.number = number; + this.precision = precision; + } + + convert() { + const number = Math.abs(this.number); + const response = this.evaluate(number); + if (this.number < 0) { + response.value = '-' + response.value; + } + return response + } + + metricSystem(number: number, order: number) { + const newNumber = number / orderOfMagnitudeNum(order); + const precision = this.precision; + return `${withXSigFigs(newNumber, precision)}`; + } + + evaluate(number: number) { + if (number === 0) { + return { value: this.metricSystem(0, 0) } + } + + const order = orderOfMagnitude(number); + if (order < -2) { + return { value: this.metricSystem(number, order), power: order }; + } else if (order < 4) { + return { value: this.metricSystem(number, 0) }; + } else if (order < 6) { + return { value: this.metricSystem(number, 3), symbol: 'K' }; + } else if (order < 9) { + return { value: this.metricSystem(number, 6), symbol: 'M' }; + } else if (order < 12) { + return { value: this.metricSystem(number, 9), symbol: 'B' }; + } else if (order < 15) { + return { value: this.metricSystem(number, 12), symbol: 'T' }; + } else { + return { value: this.metricSystem(number, order), power: order }; + } + } +} + +export function numberShow(number: number, precision = 2) { + const ns = new NumberShower(number, precision); + return ns.convert(); +}