n2words
v4.0.0
Published
Convert numbers to words in 71 languages with zero dependencies. Supports BigInt, decimals, and browser/Node.js environments.
Downloads
72,757
Readme
n2words
Numbers to words. 71 languages. Zero dependencies.
Why n2words?
- Pure Functions — Each language exports standalone functions. No classes, no configuration, no side effects.
- Tree-Shakeable — Import only what you need. Unused exports are eliminated by modern bundlers.
- Tiny Bundles — ~2.4 KB gzipped per language (with all forms). No bloat.
- Multiple Forms — Cardinal ("forty-two"), ordinal ("forty-second"), and currency ("forty-two dollars")
- 71 Languages — European, Asian, Middle Eastern, African, and regional variants
- Zero Dependencies — Works everywhere: Node.js, browsers, Deno, Bun
- BigInt Support — Handle arbitrarily large numbers without precision loss
- Type-Safe — Full TypeScript support with generated
.d.tsdeclarations
Quick Start
npm install n2wordsimport { toCardinal } from 'n2words/en-US'
import { toCardinal as es } from 'n2words/es-ES'
toCardinal(42) // 'forty-two'
es(42) // 'cuarenta y dos'Forms
n2words converts numbers to words in multiple forms:
| Form | Function | Example |
| -------- | -------------------- | ----------------------------------- |
| Cardinal | toCardinal(42) | "forty-two" |
| Ordinal | toOrdinal(42) | "forty-second" |
| Currency | toCurrency(42.50) | "forty-two dollars and fifty cents" |
import { toCardinal, toOrdinal, toCurrency } from 'n2words/en-US'
toCardinal(1234) // 'one thousand two hundred thirty-four'
toOrdinal(1234) // 'one thousand two hundred thirty-fourth'
toCurrency(1234.56) // 'one thousand two hundred thirty-four dollars and fifty-six cents'All 71 languages support all three forms. See LANGUAGES.md for details.
Usage
ESM (Node.js, modern bundlers):
import { toCardinal } from 'n2words/en-US' // Single form
import { toCardinal, toOrdinal } from 'n2words/en-US' // Multiple forms
import { toCardinal as fr } from 'n2words/fr-FR' // Aliased importBrowser (CDN):
<!-- ESM (recommended) -->
<script type="module">
import { toCardinal } from 'https://cdn.jsdelivr.net/npm/n2words/dist/en-US.js'
console.log(toCardinal(42)) // 'forty-two'
</script>
<!-- UMD (legacy script tags) -->
<script src="https://cdn.jsdelivr.net/npm/n2words/dist/en-US.umd.js"></script>
<script>
n2words.enUS(42) // 'forty-two'
n2words.ordinal.enUS(42) // 'forty-second'
n2words.currency.enUS(42.50) // 'forty-two dollars and fifty cents'
</script>See LANGUAGES.md for all language codes and available forms.
Supported Languages (71)
See LANGUAGES.md for the complete list with codes and options.
Highlights: Arabic, Chinese (Simplified/Traditional), English, French, German, Hindi, Japanese, Korean, Portuguese, Russian, Spanish, and 60 more.
Compatibility
- Node.js: 20+
- Browsers: Chrome 67+, Firefox 68+, Safari 14+, Edge 79+ (~87% global coverage)
- Runtimes: Deno, Bun, Cloudflare Workers
Requires BigInt support (cannot be polyfilled).
Performance
n2words is optimized for both size and speed:
- ~2.4 KB gzipped per language (includes all forms)
- Individual language imports enable tree-shaking
- No runtime dependencies
- BigInt modulo operations (no string manipulation)
- Pure functions with no shared state
- Minimal memory allocation per conversion
Run npm run bench to measure on your hardware.
Contributing
We welcome contributions! Add a new language or improve existing ones:
npm run lang:add <code> # Scaffold a new language (BCP 47 code)
npm test # Run full test suiteAlso welcome: bug reports, feature requests, and documentation improvements.
- Contributing Guide — How to contribute and add languages
- Code of Conduct — Community standards
License
MIT © Wael TELLAT, Tyler Vigario & contributors
