Last active
August 15, 2024 05:13
-
-
Save MartinMuzatko/1060fe584d17c7b9ca6e to your computer and use it in GitHub Desktop.
JS Commarization, Number to words from Million, Billion, Trillion.... and extendible
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function commarize() | |
{ | |
// 1e6 = 1 Million, begin with number to word after 1e6. | |
if (this >= 1e6) | |
{ | |
var units = | |
[ | |
"Million", | |
"Billion", | |
"Trillion", | |
"Quadrillion", | |
"Quintillion", | |
"Sextillion", | |
"Septillion", | |
"Octillion" | |
// ... Put others here, you can look them up here: | |
// http://bmanolov.free.fr/numbers_names.php | |
// If you prefer to automate the set of numbers, look at the number vocabulary: | |
// https://gist.github.com/MartinMuzatko/1b468b7596c71e83838c | |
// Javascript allows plain numbers to a maximum of ~1.79e308 | |
] | |
// Divide to get SI Unit engineering style numbers (1e3,1e6,1e9, etc) | |
var unit = Math.floor((this / 1000).toFixed(0).toString().length) | |
// Calculate the remainder. 1,000,000 = 1.000 Mill | |
var num = (this / ('1e'+(unit+2))).toFixed(3) | |
var unitname = units[Math.floor(unit / 3) - 1] | |
// output number remainder + unitname | |
return num + ' ' + unitname | |
} | |
// Split floating number | |
var parts = this.toString().split(".") | |
// Only manipulate first part (not the float number) | |
// If you prefer europe style numbers, you can replace . with , | |
parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ",") | |
return parts.join(".") | |
} | |
// Add method to prototype. this allows you to use this function on numbers and strings directly | |
Number.prototype.commarize = commarize | |
String.prototype.commarize = commarize |
I've simplify the Math, and added the support to say that's the min value that you want
function commarize(min) {
min = min || 1e3;
// Alter numbers larger than 1k
if (this >= min) {
var units = ["k", "M", "B", "T"];
var order = Math.floor(Math.log(this) / Math.log(1000));
var unitname = units[(order - 1)];
var num = Math.floor(this / 1000 ** order);
// output number remainder + unitname
return num + unitname
}
// return formatted original number
return this.toLocaleString()
}
// Add method to prototype. this allows you to use this function on numbers and strings directly
Number.prototype.commarize = commarize
String.prototype.commarize = commarize
This is only working until you reach a number higher than 1e21.
I just want an example in HTML code please if it's possible
how can I define the code inside chart js?
options: {
scales: {
yAxes: [{
ticks: {
// Include a dollar sign in the ticks
callback: function(value, index, values) {
return String(value).commarize();
}
}
}]
}
}
it's not working please give me the solution
For the sake of history I leave this script here, but seriously. Use something like numeral.js to format numbers. :)
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
The commarize function above does not work properly, unit should be multiple of 3, which is not the case. Try e.g. 12,345,678, this should yield 12.345M but it gives 1.234M.
This one should work better (and supports k):