Formatting dates and numbers in React
Formatting numbers and dates is a common requirement for lots of apps but how do we do this in react apps?
Let’s say we have a component in our app that shows a list of customers, looking like this: 
… and here’s the current code for this component:`// CustomerSearchResults.tsx
import * as React from "react";import Customer from "./Customer";
interface CustomerSearchResultsProps {  customers: Customer[];}
const CustomerSearchResults = (props: CustomerSearchResultsProps) => {  const rows = props.customers.map(customer => (    <tr key={customer.id}>      <th>{customer.id}</th>      <td>{customer.name}</td>      <td>{customer.revenue}</td>      <td>{customer.firstSale.toString()}</td>    </tr>  ));
  return (    <table className="table table-hover">      <thead>        <tr>          <th>Id</th>          <th>Name</th>          <th>Revenue</th>          <th>First Sale</th>        </tr>      </thead>      <tbody>{rows}</tbody>    </table>  );};
export default CustomerSearchResults;… with the following data:`// customers.json
// customers.json
[  {    id: 1,    name: "Alfreds Futterkiste",    revenue: 12000,    firstSale: "2012-04-23T00:00:00.000Z"  },  {    id: 2,    name: "Chop-suey Chinese",    revenue: 34000,    firstSale: "2000-10-21T00:00:00.000Z"  },  {    id: 3,    name: "Ernst Handel",    revenue: 82400,    firstSale: "2000-01-03T00:00:00.000Z"  },  {    id: 4,    name: "Maison Dewey",    revenue: 10000,    firstSale: "2012-06-02T00:00:00.000Z"  },  {    id: 5,    name: "Rancho grande",    revenue: 40000,    firstSale: "1976-01-04T00:00:00.000Z"  }];You can see that we need to clean up the revenue and first sale data by formatting them.
Formatting numbers
We can use Intl.NumberFormat to format the revenue:
<td>  {new Intl.NumberFormat("en-GB", {    style: "currency",    currency: "GBP"  }).format(customer.revenue)}</td>In the above example we are formatting to revenue using Great British locale, using the Great British currency style.
So, we now have this: 
But what if we don’t want the decimals in the revenue? We just add the min and max fraction digits in the options:
<td>  {new Intl.NumberFormat("en-GB", {    style: "currency",    currency: "GBP",    minimumFractionDigits: 0,    maximumFractionDigits: 0  }).format(customer.revenue)}</td>
Formatting dates
We could just use toLocaleDateString instead of toString:
<td>{customer.firstSale.toLocaleDateString()}</td>… which gives us a nice short date: 
However, we can use Intl.DateTimeFormat to gain more control on the formatting:
<td>  {new Intl.DateTimeFormat("en-GB", {    year: "numeric",    month: "long",    day: "2-digit"  }).format(customer.firstSale)}</td>Here we are specifying a 2 digit day, a long month and a 4 digit year.
So, here’s our final CustomerSearchResults component code:
import * as React from "react";import Customer from "./Customer";
interface CustomerSearchResultsProps {  customers: Customer[];}
const CustomerSearchResults = (props: CustomerSearchResultsProps) => {  const rows = props.customers.map(customer => (    <tr key={customer.id}>      <th>{customer.id}</th>      <td>{customer.name}</td>      <td>        {new Intl.NumberFormat("en-GB", {          style: "currency",          currency: "GBP",          minimumFractionDigits: 0,          maximumFractionDigits: 0        }).format(customer.revenue)}      </td>      <td>        {new Intl.DateTimeFormat("en-GB", {          year: "numeric",          month: "long",          day: "2-digit"        }).format(customer.firstSale)}      </td>    </tr>  ));
  return (    <table className="table table-hover">      <thead>        <tr>          <th>Id</th>          <th>Name</th>          <th>Revenue</th>          <th>First Sale</th>        </tr>      </thead>      <tbody>{rows}</tbody>    </table>  );};
export default CustomerSearchResults;… and here’s what it looks like:

Much better!
Learn React with TypeScript - 3rd Edition
NewA comprehensive guide to building modern React applications with TypeScript. Learn best practices, advanced patterns, and real-world development techniques.
View on Amazon