Interesting NumberFormat
API behavior
The Intl.NumberFormat
API behaves in an interesting way when fed with invalid input. Its format
method takes one number argument, but it still “works” if it’s provided with a string argument.
(new Intl.NumberFormat("de")).format("0.1")
//> "0,1"
In essence, you can feed it with string values that look like JavaScript numbers (under the hood, it uses the ECMAScript standard’s ToNumeric
operation). For other string values like letters, it returns “NaN”.
(new Intl.NumberFormat("en")).format("x")
//> "NaN"
Note that the return value isn’t the special value NaN
but the string value "NaN"
. Annoyingly, you can’t reliably detect such a failure by checking for strict equality with the string literal "NaN"
because, and that was quite surprising, the result is sometimes localized:
(new Intl.NumberFormat("ru")).format("x")
//> "не число"
For some locales (e.g. "ru"
, "tk"
), the returned value isn’t “NaN” but rather the translation of the phrase “not a number” (that’s what “не число” translates to). I’ve tried this in the latest stable versions of Mozilla Firefox and Google Chrome.
I would’ve preferred for calls to format
with “it doesn’t look like a number” values to either return null
or "NaN"
(consistently) or to throw an error. Then, one would be able to detect whether a string value looks like a JavaScript number. Not that this would be very useful. One can already perform this kind of check using !Number.isNaN(Number(value))
.