Skip to content
This repository was archived by the owner on Feb 20, 2019. It is now read-only.

Commit 8e5d379

Browse files
tko8Kent C. Dodds
authored andcommitted
feat: convers a number to string representation (#227)
Converts a positive integer up to 2^53-1 to its English string representation.
1 parent c8dea4b commit 8e5d379

File tree

3 files changed

+106
-0
lines changed

3 files changed

+106
-0
lines changed

src/index.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ import first from './first'
8585
import mode from './mode-array'
8686
import rollDice from './rollDice'
8787
import inchesToMetric from './inches-to-metric'
88+
import numberToString from './numberToString'
8889

8990
export {
9091
reverseArrayInPlace,
@@ -174,4 +175,5 @@ export {
174175
mode,
175176
rollDice,
176177
inchesToMetric,
178+
numberToString,
177179
}

src/numberToString.js

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
/*eslint complexity: ["error", 10]*/
2+
export default numberToString
3+
4+
/**
5+
* Original source: https://stackoverflow.com/questions/5529934/javascript-numbers-to-words
6+
*
7+
* Converts an int to its string representation
8+
*
9+
* @param {Number} number - input integer (MAX_SAFE_INTEGER)
10+
* @return {String} - String representation of the integer
11+
*/
12+
13+
const stringLookup = [
14+
{key: 1000000000000000, value: 'quadrillion'},
15+
{key: 1000000000000, value: 'trillion'},
16+
{key: 1000000000, value: 'billion'},
17+
{key: 1000000, value: 'million'},
18+
{key: 1000, value: 'thousand'},
19+
{key: 100, value: 'hundred'},
20+
{key: 90, value: 'ninety'},
21+
{key: 80, value: 'eighty'},
22+
{key: 70, value: 'seventy'},
23+
{key: 60, value: 'sixty'},
24+
{key: 50, value: 'fifty'},
25+
{key: 40, value: 'forty'},
26+
{key: 30, value: 'thirty'},
27+
{key: 20, value: 'twenty'},
28+
{key: 19, value: 'nineteen'},
29+
{key: 18, value: 'eighteen'},
30+
{key: 17, value: 'seventeen'},
31+
{key: 16, value: 'sixteen'},
32+
{key: 15, value: 'fifteen'},
33+
{key: 14, value: 'fourteen'},
34+
{key: 13, value: 'thirteen'},
35+
{key: 12, value: 'twelve'},
36+
{key: 11, value: 'eleven'},
37+
{key: 10, value: 'ten'},
38+
{key: 9, value: 'nine'},
39+
{key: 8, value: 'eight'},
40+
{key: 7, value: 'seven'},
41+
{key: 6, value: 'six'},
42+
{key: 5, value: 'five'},
43+
{key: 4, value: 'four'},
44+
{key: 3, value: 'three'},
45+
{key: 2, value: 'two'},
46+
{key: 1, value: 'one'},
47+
]
48+
49+
function numberToString(number) {
50+
if (number <= 0 || number > Number.MAX_SAFE_INTEGER) {
51+
return 'Number needs to be grater than 0 or less than 2^53-1.'
52+
}
53+
let result = ''
54+
55+
for (const n of stringLookup) {
56+
if (number >= n.key) {
57+
if (number < 100) {
58+
result += n.value
59+
number -= n.key
60+
number > 0 ? result += ' ' : result
61+
} else {
62+
const t = Math.floor(number / n.key)
63+
const d = number % n.key
64+
return d > 0 ? `${numberToString(t)} ${n.value} ${numberToString(d)}` : `${numberToString(t)} ${n.value}`
65+
}
66+
}
67+
}
68+
return result
69+
}

test/numberToString.test.js

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import test from 'ava'
2+
import {numberToString} from '../src'
3+
4+
test('Convert lowest allowed number to string', t => {
5+
const number = 1
6+
const stringNum = 'one'
7+
const actual = numberToString(number)
8+
t.deepEqual(actual, stringNum)
9+
})
10+
11+
test('Convert high number like 214124124 to string', t => {
12+
const number = 214124124
13+
const stringNum = `two hundred fourteen million one hundred twenty four thousand one hundred twenty four`
14+
const actual = numberToString(number)
15+
t.deepEqual(actual, stringNum)
16+
})
17+
18+
test('Convert 1000 to string', t => {
19+
const number = 1000
20+
const stringNum = `one thousand`
21+
const actual = numberToString(number)
22+
t.deepEqual(actual, stringNum)
23+
})
24+
25+
test('Zero and negative numbers should return error message', t => {
26+
const actual = numberToString(0)
27+
const errorMessage = 'Number needs to be grater than 0 or less than 2^53-1.'
28+
t.deepEqual(actual, errorMessage)
29+
})
30+
31+
test('Numbers greater than Number.MAX_SAFE_INTEGER should return error message', t => {
32+
const actual = numberToString(Number.MAX_SAFE_INTEGER + 1)
33+
const errorMessage = 'Number needs to be grater than 0 or less than 2^53-1.'
34+
t.deepEqual(actual, errorMessage)
35+
})

0 commit comments

Comments
 (0)