numberwang
numberwang
will convert floating point numbers (and integers) to their
word representations, and vice versa.
The key differentiator of this package, compared to {nombre}, is that it supports decimal representations by listing individual decimal digits.
See below for a comparison with {nombre}
, {english}
, {spanish}
and {xfun}
.
What’s in the box
num_to_words(num, decimals = 3)
converts numeric vectors to character vectorswords_to_num(words)
converts character vectors to numeric vectors
Installation
You can install from GitHub with:
# install.package('remotes')
remotes::install_github('coolbutuseless/numberwang')
That’s numberwang
library(numberwang)
c(12, pi, exp(10))
#> [1] 12.000000 3.141593 22026.465795
num_to_words(c(12, pi, exp(10)))
#> [1] "twelve"
#> [2] "three point one four two"
#> [3] "twenty-two thousand and twenty-six point four six six"
words_to_num(c(
'negative fifteen point seven',
"twenty-three point seven zero one",
"ten million, two thousand and forty two"
))
#> [1] -15.700 23.701 10002042.000
Limitations
- Floating point representation isn’t exact, which means that for very large numbers or very small numbers, and for lots of numbers inbetween, all the digits after the first few must often be taken with a grain of salt.
- E.g.
formatC(0.3-0.2, format = 'f', digits = 20) = 0.09999999999999997780
- E.g.
1e25
should just be a1
followed by zeros, but in floating point representation we get:formatC(1e25, format = 'f', digits = 0) = 10000000000000000905969664
- The
{english}
and{nombre}
packages will warn you about precision loss like this, but{numberwang}
won’t.
Feature comparison
numberwang | nombre | english | spanish | xfun | |
---|---|---|---|---|---|
function | num_to_words | nom_card | english | to_words | n2w |
working range | double() | double() | +/- 2^90 | [0,999] | +/- 1e15 |
decimals | Yes | as fractions | No | No | No |
spanish | No | No | No | Yes | No |
words-to-numbers | words_to_num | nom_uncard (ints only) | No | No | No |
Just for fun - Let’s rotate the board!
exp(300)
#> [1] 1.942426e+130
formatC(
exp(300), format = 'f', digits = 0
)
#> [1] "19424263952412558251527551342607068708348876681949259689720520473778975990853476787505520791207218561168735878224980403355291484160"
num_to_words(exp(300))
nineteen duoquadragintillion, four hundred and twenty-four
unquadragintillion, two hundred and sixty-three quadragintillion, nine
hundred and fifty-two novemtrigintillion, four hundred and twelve
octatrigintillion, five hundred and fifty-eight septentrigintillion,
two hundred and fifty-one sextrigintillion, five hundred and
twenty-seven quintrigintillion, five hundred and fifty-one
quattuortrigintillion, three hundred and forty-two tretrigintillion,
six hundred and seven duotrigintillion, sixty-eight untrigintillion,
seven hundred and eight trigintillion, three hundred and forty-eight
novemvigintillion, eight hundred and seventy-six octavigintillion, six
hundred and eighty-one septenvigintillion, nine hundred and forty-nine
sexvigintillion, two hundred and fifty-nine quinvigintillion, six
hundred and eighty-nine quattuorvigintillion, seven hundred and twenty
trevigintillion, five hundred and twenty duovigintillion, four hundred
and seventy-three unvigintillion, seven hundred and seventy-eight
vigintillion, nine hundred and seventy-five novemdecillion, nine
hundred and ninety octadecillion, eight hundred and fifty-three
septendecillion, four hundred and seventy-six sexdecillion, seven
hundred and eighty-seven quindecillion, five hundred and five
quattuordecillion, five hundred and twenty tredecillion, seven hundred
and ninety-one duodecillion, two hundred and seven undecillion, two
hundred and eighteen decillion, five hundred and sixty-one nonillion,
one hundred and sixty-eight octillion, seven hundred and thirty-five
septillion, eight hundred and seventy-eight sextillion, two hundred and
twenty-four quintillion, nine hundred and eighty quadrillion, four
hundred and three trillion, three hundred and fifty-five billion, two
hundred and ninety-one million, four hundred and eighty-four thousand,
one hundred and sixty
Acknowledgements
- R Core for developing and maintaining the language.
- CRAN maintainers, for patiently shepherding packages onto CRAN and maintaining the repository