d3-format icon indicating copy to clipboard operation
d3-format copied to clipboard

Improve readability of SI format for very small/large numbers

Open patkwee opened this issue 4 years ago • 2 comments

It would be great to improve the 'human-readability' of SI format "s" for very small/large numbers. At the moment d3-format generates:

console.log(format("s")(1e-50))  -> "0.00000000000000000000000001y"
console.log(format("s")(1e+50)) -> "100000000000000000000000000Y"

I would propose to fall back to exponent notation ("e" format) for numbers below abs(x)<1e-24 or above abs(x)>1e24.

In my application, usually the numbers are in a range where the "s"-format makes sense. Though, sometimes, e.g. due to numerical inaccuracy of calculations, I get very small numbers, that blow-up my output.

patkwee avatar Mar 27 '21 09:03 patkwee

For small numbers you could round the number before formatting:

a => format("s")(+a.toFixed(26));

Fil avatar Mar 27 '21 10:03 Fil

Yes, true. I currently just check for abs(x)<1e-24 and then use "e" or "s" formatting. My point is more that a 'human' would format 1e-50 rather as 1e-50 than as 0.00000000000000000000000001y and therefore it might be an interesting improvement proposal.

Libraries like vega and vega-lite also use d3-format. There a workaround is also possible with custom formatters, but it gets more and more tedious.

patkwee avatar Mar 28 '21 11:03 patkwee