DEV Community

Cover image for Simplify Currency Formatting in React: A Zero-Dependency Solution with Intl API
Giuseppe Ciullo
Giuseppe Ciullo

Posted on • Originally published at dev.giuseppeciullo.it

Simplify Currency Formatting in React: A Zero-Dependency Solution with Intl API

Currency formatting is a crucial aspect of many web applications, especially in e-commerce or financial dashboards. A clear and intuitive interface helps users quickly understand costs, avoiding ambiguities due to differences in currency or numerical formats. Let's see how to create a React component to display monetary amounts using Intl.NumberFormat, avoiding external dependencies and keeping the code lightweight and performant.

What is Intl.NumberFormat?

The Intl.NumberFormat API is the native method for formatting numbers based on user localization. With this API, we can handle currency formatting efficiently without relying on additional libraries. Its advantages include:

  • Compatibility with modern browsers without the need for external libraries

  • Support for multiple currencies and formatting styles

  • Reduced bundle size, improving performance and reducing application load times.

How Intl.NumberFormat Works

The Intl.NumberFormat API works by taking a locale and an optional set of formatting options to produce a localized string representation of a number. When instantiated, it creates a formatter that applies the specified rules, such as currency, percentage, or decimal formatting. Under the hood, it leverages the JavaScript Intl (Internationalization) object to ensure proper number formatting based on the selected locale.

For example, different locales format the same number in distinct ways:

const usdFormatter = new Intl.NumberFormat("en-US", {
  style: "currency",
  currency: "USD",
});

const eurFormatter = new Intl.NumberFormat("de-DE", {
  style: "currency",
  currency: "EUR",
});

console.log(usdFormatter.format(1234.56)); // "$1,234.56"
console.log(eurFormatter.format(1234.56)); // "1.234,56 €"
Enter fullscreen mode Exit fullscreen mode

By utilizing this approach, applications can seamlessly adapt to various user preferences and regional conventions without requiring external dependencies.

How to Use Intl.NumberFormat

Using Intl.NumberFormat in your application is simple. You initialize a new instance with a locale and a set of options, then call .format(value) to get the formatted output. The API allows for extensive customization, making it versatile for different use cases.

Here’s how to format a number as a currency value in US dollars:

const formatter = new Intl.NumberFormat("en-US", {
  style: "currency",
  currency: "USD",
});

console.log(formatter.format(1234.56)); // "$1,234.56"
Enter fullscreen mode Exit fullscreen mode

Beyond currency formatting, you can adjust properties like minimumFractionDigits and maximumFractionDigits to control decimal precision:

const preciseFormatter = new Intl.NumberFormat("en-US", {
  style: "currency",
  currency: "USD",
  minimumFractionDigits: 3,
  maximumFractionDigits: 3,
});

console.log(preciseFormatter.format(1234.5)); // "$1,234.500"
Enter fullscreen mode Exit fullscreen mode

For more details and advanced usage, refer to the official MDN documentation.

Creating the CurrencyFormatter Component

Let’s create a simple React component that leverages Intl.NumberFormat to format monetary values according to the selected currency and locale.

const CurrencyFormatter = ({ value, currency = "USD", locale = "en-US" }) => {
  const formattedValue = new Intl.NumberFormat(locale, {
    style: "currency",
    currency,
  }).format(value);

  return <span>{formattedValue}</span>;
};

export default CurrencyFormatter;
Enter fullscreen mode Exit fullscreen mode

Using the Component

After creating our CurrencyFormatter component, we can easily use it within a React application. This allows us to display monetary amounts clearly and professionally without writing redundant code.

import CurrencyFormatter from "./CurrencyFormatter";

const App = () => (
  <div>
    <strong>Price:</strong>
    <CurrencyFormatter value={1999.99} currency="EUR" locale="it-IT" />
  </div>
);

export default App;
Enter fullscreen mode Exit fullscreen mode

Additional Customizations

If we need more control over the formatting, we can add optional parameters such as the minimum and maximum number of decimal digits. This allows us to adapt the display to different contexts where the component will be used.

With this customization, we ensure that monetary values are displayed with the desired level of precision, enhancing the user experience and usability of the application.

const CurrencyFormatter = ({ value, currency = "USD", locale = "en-US", minimumFractionDigits = 2, maximumFractionDigits = 2 }) => {
  const formattedValue = new Intl.NumberFormat(locale, {
    style: "currency",
    currency,
    minimumFractionDigits,
    maximumFractionDigits,
  }).format(value);

  return <span>{formattedValue}</span>;
};
Enter fullscreen mode Exit fullscreen mode

Conclusion

Using Intl.NumberFormat to format currencies is an efficient, high-performance, and dependency-free solution. This approach allows us to ensure the correct display of currencies based on user localization without adding unnecessary weight to our project.

Top comments (0)