Fork 0
[DEPRECATED] A tiny currency formatting library for JavaScript
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
This repo is archived. You can view files and clone it, but cannot push or open issues/pull-requests.
Nikita Karamov b4cce65cb9
Update docs
6 months ago
.github Delete GitHub Actions 6 months ago
docs Update docs 6 months ago
src Fix invalid formatting for numbers <0 1 year ago
test Add test cases for #8 1 year ago
.eslintrc.json Update ESLint and its config 1 year ago
.gitignore Migrate to PNPM and delete lockfile 6 months ago Update metadata 6 months ago
LICENSE Update year in LICENSE 1 year ago Add deprecation notice 6 months ago
package.json v1.1.2 6 months ago
tsconfig.json Migrate from Rollup to Microbundle 1 year ago


Starting with Node 14, all currency values are formatted correctly. You can use the built-in Number.prototype.toLocaleString() method instead.

This project will not be developed any further.


Money With Wings emoji

A tiny currency formatting library for JavaScript.

  • Small. Dependency-free. ~500 bytes minified and gzipped. Controlled by Size Limit.
  • Functional. The function is automatically curried (think Ramda).
  • Flexible. It can be tweaked to present any modern currency.
import prettyMoney from "pretty-money";
let price = prettyMoney({ currency: "EUR" }, 10000); //=> "10000 EUR"

Works in any environment, be that Node.js or a browser. Try it yourself!


pretty-money is available on NPM, so you can install it your usual way:

npm install pretty-money
# or
yarn add pretty-money

If you only need to use pretty-money on the client side, you can install the latest version with jsDelivr:

<script src=""></script>

In modern browsers, you can use:

<script type="module">
  import prettyMoney from ""


There are two ways to use pretty-money: traditional and functional.

Traditional way is to call the function with two parameters: the config object and the number you need to format:

const prettyDollarConfig = {
    currency: "$",
    position: "before",
    spaced: false,
    thousandsDelimiter: ","

const priceA = prettyMoney(prettyDollarConfig, 1234); //=> "$1,234"
const priceB = prettyMoney(prettyDollarConfig, 567.89); //=> "$567.89"

Functional way is to curry the function, i.e. to create a function with a set config and to later call it with only one parameter — the number to format:

const prettyEuro = prettyMoney({
    currency: "€",
    decimals: "fixed",
    decimalDelimiter: ",",
    thousandsDelimiter: "."

const priceA = prettyEuro(1234); //=> "1.234,00 €"
const priceB = prettyEuro(567.89); //=> "567,89 €"

You can read more about the available configuration parameters in the next section, Config.



Type: string
Default: ""

The string to be used as currency symbol.
It can be a respective sign (like "$"), currency code (like "GBP") or a word (like "peso").


Type: string
Default: "."

The string that separates the integer and the fractional parts of the number.


Type: number
Default: 2

The maximum number of decimal places allowed in the number.


Type: number
Default: 0

The minimum number of decimal places allowed in the number. Has no effect when decimals is set to "fixed".


Type: string
Values: "fixed", "fluid" or "minmax"
Default: "minmax"

Sets the strategy to calculate the amount of decimal places.

  • "fixed" — the amount of places will always stay at maxDecimal. minDecimal has no effect.
  • "fluid" — the amount of places will stay at any number between minDecimal and maxDecimal, in order not to have trailing zeros.
  • "minmax" — the amount of places will stay at maxDecimal unless it's possible to be at minDecimal without having trailing zeros.


Type: string
Values: "before" or "after"
Default: "after"

Sets the position of the currency symbol with respect to the number.


Type: boolean
Default: true

Sets whether there should be a space between the number and the currency symbol.


Type: string
Default: ""

A string that separates the thousands of the number.

Difference from toLocaleString

ECMAScript's Number has a method toLocaleString, which has a similar idea. It too can be used to format numbers as financial values, and it even has a lot of built-in locales. However, the output of it is different on different Node.js versions and browsers:

let price = (10000).toLocaleString("ru", {
    style: "currency",
    currency: "RUB"

//=> "10 000,00 ₽"    in modern browsers
//=> "RUB 10,000.00"  in Node v12.13.0
//=> "RUB 10,000"     in Node v4.8.6

This can lead to unexpected output and difficulties in debugging.

While pretty-money doesn't have any locales built-in, it provides a flexible API, so that the end user can compose any currency formatting function they need.

let price = prettyMoney({
    currency: "₽",
    thousandsDelimiter: " "
}, 10000);

//=> "10 000 ₽"       in every Node, in every browser


If you want to improve pretty-money, create your own fork of it or just play around with the developer build, here's all you need to know:

  • yarn dev to start a dev server, which will automatically build the library after you change the source and output it to ./dist/
  • yarn build to build the production-ready minified version of the library and output it to ./dist/
  • yarn test to build the project and run all tests, which include:
    • yarn test:lint to check the code formatting with ESLint (this won't auto fix errors)
    • yarn test:unit to run the uvu unit tests and calculate coverage
    • yarn test:size to check the size

There are no peer dependencies and other extra requirements. Any help is welcome when it keeps things simple and small.


Copyright © 2020–2021 Nikita Karamov
Licenced under the MIT License.