intlify / vue-i18n

Vue I18n for Vue 3
https://vue-i18n.intlify.dev/
MIT License
2.13k stars 326 forks source link

Number Formatting: support BigInt and String in additional to Number #1253

Open mahnunchik opened 1 year ago

mahnunchik commented 1 year ago

Clear and concise description of the problem

Intl.NumberFormat supports Number, BigInt, and String as a number parameter.

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

A Number, BigInt, or string, to format. Strings are parsed in the same way as in number conversion, except that format() will use the exact value that the string represents, avoiding loss of precision during implicitly conversion to a number.

Currently only number is supported in vue-i18n library: https://github.com/intlify/vue-i18n-next/blob/fa612d336e603cce237491eca092a7e856e4cb6c/packages/vue-i18n-core/src/components/NumberFormat.ts#L44-L47

Suggested solution

$n method should support the same types of parameter as underlying Intl.NumberFormat.prototype.format() method.

Alternative

No response

Additional context

Validations

mahnunchik commented 1 year ago

Any news?

I'm unable to format number like Intl.NumberFormat can:

const number = '123456.78900000000000001';

console.log(new Intl.NumberFormat('en', { maximumFractionDigits: 20 }).format(number));
// 123,456.78900000000000001
mahnunchik commented 1 year ago

MDN data is outdated https://github.com/mdn/browser-compat-data/issues/18447

kazupon commented 1 year ago

hmm 🤔 I would like to support BigInt for NumberFormat, but, vue-i18n uses classic props, which results in a type error. 😭 https://github.com/vuejs/core/issues/5652