Reputation: 17181
I want something like the library JavaScript BigNum and Numeral.js working together.
In Numeral.js, I can use strings like this:
var number = numeral('1110000000000000000000000000000000000000000000000000011100000000000000000011111111100');
but the result of number.format();
is really disappointing:
"1.11e+84"
Any way to format a (really) big number nicely?
EDIT: I don't want just avoid scientific notation, it was a wrong assumption. I want to "nicely" format, as I want, for example:
var number = numeral(1000);
numeral.defaultFormat('$0,0.00');
number.format();
// '$1,000.00'
Well, if the number is big:
var number = numeral('100000000000000000000000000');
"$9.999999999999999e+25"
This is a mess. I know JavaScript can't handle big numbers, but my question is exactly because that! I would like a library or a possible solution to this problem.
Upvotes: 1
Views: 4028
Reputation: 5220
If you want numbers like '1110000000000000000000000000000000000000000000000000011100000000000000000011111111100' to be handled and printed without precision lost you can:
Store this number as a string and never convert into number. The disadvantage is clear here: you will be not able perform arithmetic operations with numbers in string representation.
You can use one of big numbers library, e.g. big-numbers (https://www.npmjs.com/package/big-numbers). This will allow you to perform calculations and do not lost precision.
Example code:
var bn = new BugNumbers();
var longNumber = bn.of('1110000000000000000000000000000000000000000000000000011100000000000000000011111111100');
var longNumberPlusOne = longNumber.add(1);
// Should pring1110000000000000000000000000000000000000000000000000011100000000000000000011111111101
console.log(bn.format(longNumberPlusOne));
Check documentation for details: http://www.bignumbers.tech
Upvotes: 0
Reputation: 8153
If you are supporting only recent browsers, I think it might be enough for you to just use Intl.NumberFormat.
Although you it lose precision on big numbers, it will help you show big numbers and currencies pretty easily:
var number = 1234567890123456789012345678901234567890;
console.log(new Intl.NumberFormat('de-DE', { style: 'currency', currency: 'EUR' }).format(number));
// → 1.234.567.890.123.460.000.000.000.000.000.000.000.000,00 €
console.log(new Intl.NumberFormat('ja-JP', { style: 'currency', currency: 'JPY' }).format(number));
// → ¥1,234,567,890,123,460,000,000,000,000,000,000,000,000
Upvotes: 1
Reputation: 1
You can use Intl.NumberFormat.prototype.format, String.prototype.slice(), String.prototype.concat()
var number = 2.9364136545300044e+24;
var n = new Intl.NumberFormat().format(number);
var res = n.slice(0, 9).concat(".").concat(n.slice(10, 12));
console.log(res);
Upvotes: 0