WARNING: THIS SITE IS A MIRROR OF GITHUB.COM / IT CANNOT LOGIN OR REGISTER ACCOUNTS / THE CONTENTS ARE PROVIDED AS-IS / THIS SITE ASSUMES NO RESPONSIBILITY FOR ANY DISPLAYED CONTENT OR LINKS / IF YOU FOUND SOMETHING MAY NOT GOOD FOR EVERYONE, CONTACT ADMIN AT ilovescratch@foxmail.com
Skip to content

Conversation

@Pixselve
Copy link
Contributor

@Pixselve Pixselve commented Nov 3, 2025

Description

This PR move the number formatting to using the native helper Intl.NumberFormat.

What is Intl.NumberFormat

See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat/NumberFormat

It is a set of helpers to format number based on the provided locale.

Intl.NumberFormat is widely available in all browsers since 2017. Options supports varies.

notation
image
maximumFractionDigits
image
compactDisplay
image

Why

  1. In English, based on unicode.org, 1,000,000,000 should be 1B (instead of 1G like in the code) (see https://www.unicode.org/cldr/cldr-aux/charts/29/verify/numbers/en.html)
  2. Custom logic is prone to errors.
  3. We may want to expose the locale (currently hardcoded to en-US) to format numbers based on the user's language.

In this PR, I also updated how numbers are truncated, to reflect how CloudWatch charts are currently behaving. The number 0.00086661402 is truncated in CDS, but not on the console.

How has this been tested?

  • Added unit tests.
  • Updated the data of a demo page to use small/large values.
Review checklist

Correctness

Security

Testing

  • Changes are covered with new/existing unit tests?
  • Changes are covered with new/existing integration tests?

By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice.

if (absValue >= 1e3) {
return format(value / 1e3) + "K";
// Use scientific notation for very small numbers
if (absValue < 1e-9) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there a specific reason why the threshold of this condition changes from 0.01 (i.e, 1e-2) to 1e-9?

@pan-kot Would this be a problem?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In this PR, I also updated how numbers are truncated, to reflect how CloudWatch charts are currently behaving. The number 0.00086661402 is truncated in CDS, but not on the console.

I am open to the discussion about that. It may be valuable to expose that setting to the chart props?

Copy link
Member

@pan-kot pan-kot Nov 12, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You can do that in the test pages - but let's not change the current precision in the default chart formatters. What is good for one team might not work for another.

All formatters can be already overridden in both public and core APIs.

expect(formatter.call(mockAxisContext({ value: 0.03 }))).toBe("0.03");
expect(formatter.call(mockAxisContext({ value: 0.003 }))).toBe("3e-3");
expect(formatter.call(mockAxisContext({ value: 0.003 }))).toBe("0.003");
expect(formatter.call(mockAxisContext({ value: 0.0000000003 }))).toBe("3E-10");
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why is the "E" uppercase?

Copy link
Contributor Author

@Pixselve Pixselve Nov 4, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It is based on the Unicode Common Locale Data Repository. See https://cldr.unicode.org/translation/number-currency-formats/number-and-currency-patterns

Type Example pattern Meaning
E # E 0 This marks a scientific format. The E symbol may change position. Must be retained.

@Pixselve
Copy link
Contributor Author

Pixselve commented Nov 5, 2025

Fixed the functional test

"jsx": "react-jsx",
"types": [],
"lib": ["es2019", "dom", "dom.iterable"],
"lib": ["es2020", "dom", "dom.iterable"],
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why is this change needed?

const chart = w.findCartesianHighcharts('[data-testid="grouped-column-chart"]');
const point = chart.find('[aria-label="Jul 2019 6.32K, Prev costs"]');
const expectedTooltipContent = ["Jul 2019\nCosts\n8.77K\nPrev costs\n6.32K"];
const point = chart.find('[aria-label="Jul 2019 6.322K, Prev costs"]');
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why did we increase the default precision?

function numberFormatter(value: number): string {
const format = (num: number) => parseFloat(num.toFixed(2)).toString(); // trims unnecessary decimals

function numberFormatter(value: number, locale: string = "en-US"): string {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

should we take locale from the document instead?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Made a PR to share the locale getting logic: cloudscape-design/component-toolkit#176

test("uses default numeric axes formatters for integer values", () => {
renderChart({ highcharts, options: { series, xAxis: { title: { text: "X" } }, yAxis: { title: { text: "Y" } } } });
getAxisOptionsFormatters().forEach((formatter) => {
// See https://www.unicode.org/cldr/cldr-aux/charts/29/verify/numbers/en.html
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

let's better add this reference to the formatter function, not tests

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants