Skip to content

Commit 2a02579

Browse files
committed
Add short numeric form in engineering notation for formating numbers
1 parent 003290b commit 2a02579

File tree

2 files changed

+23
-16
lines changed

2 files changed

+23
-16
lines changed

src/App.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,14 +79,15 @@ function App() {
7979
{/*increase points from clicking a button*/}
8080
<button onClick={() => addPointsFromClick()}>Click to Add Points</button>
8181
<br />
82-
Clicker Level: {clickers}
82+
Clicker Level: <NumericDisplay value={clickers} shortForm={false} />
8383
<br />
8484
{/*upgrade clicker (points per click)*/}
8585
<button onClick={() => upgradeClicker()}>
8686
Upgrade Clicker (Points Per Click)
8787
</button>
8888
<CostDisplay cost={10 * Math.pow(2, clickers - 1)} />
89-
Autoclicker Level: {autoClickers}
89+
Autoclicker Level:{" "}
90+
<NumericDisplay value={autoClickers} shortForm={false} />
9091
<br />
9192
{/*upgrade points per second*/}
9293
<button onClick={() => upgradePointsPerSecond()}>

src/components/NumericDisplay/NumericDisplay.js

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,28 +2,34 @@ import React from 'react';
22
import PropTypes from 'prop-types';
33
import styles from './NumericDisplay.module.css';
44

5-
function formatNumber(number) {
5+
function formatNumber(number, shortForm = true) {
66
//format number to short form with numeric prefixes
7-
const exponent = Math.floor(Math.log10(number));
8-
const exponent3 = Math.floor(exponent / 3) * 3;
9-
const prefixes = ['', 'K', 'M', 'B', 'T'];
10-
if (number < 1000) {
11-
return number.toString();
7+
if (shortForm) {
8+
//if short form is true
9+
const exponent = Math.floor(Math.log10(Math.abs(Math.max(number, 1)))); //exponent component of number
10+
const exponent3 = Math.floor(exponent / 3) * 3; //exponent with multiple of 3 for engineering notation
11+
const prefixes = ["", "K", "M", "B", "T"]; //numeric prefixes
12+
if (Math.abs(number < 1000)) {
13+
//if number is less than 1 thousand
14+
return Math.round(number).toString(); //return number rounded to nearest integer
15+
} else {
16+
const roundedNumber = number.toPrecision(3); //round number to 3 significant figures
17+
return (
18+
(parseFloat(roundedNumber) / Math.pow(10, exponent3)).toPrecision(3) +
19+
prefixes[exponent3 / 3]
20+
); //return coefficient of engineering notation with numeric prefix
21+
}
1222
} else {
13-
const roundedNumber = number.toPrecision(3);
14-
return (
15-
(parseFloat(roundedNumber) / Math.pow(10, exponent3)).toPrecision(3) +
16-
prefixes[exponent3 / 3]
17-
);
23+
return number.toString();
1824
}
1925
}
2026
const NumericDisplay = (
21-
{ value }, //display numeric values
27+
{ value, shortForm }, //display numeric values
2228
) => (
2329
<span className={styles.NumericDisplay} data-testid="NumericDisplay">
2430
{/*display numeric values with specified styles*/}
25-
{formatNumber(value)}
26-
{/*bold the numeric value with short exponential form (engineering notation)*/}
31+
{formatNumber(value, shortForm)}
32+
{/*bold the numeric value display with short exponential form (engineering notation) if short form is true*/}
2733
</span>
2834
);
2935

0 commit comments

Comments
 (0)