I have a function to add commas to numbers:
function commafy( num ) { num.toString().replace( /B(?=(?:d{3})+)$/g, "," ); }
Unfortunately, it doesn’t like decimals very well. Given the following usage examples, what is the best way to extend my function?
commafy( "123" ) // "123" commafy( "1234" ) // "1234" // Don't add commas until 5 integer digits commafy( "12345" ) // "12,345" commafy( "1234567" ) // "1,234,567" commafy( "12345.2" ) // "12,345.2" commafy( "12345.6789" ) // "12,345.6789" // Again, nothing until 5 commafy( ".123456" ) // ".123 456" // Group with spaces (no leading digit) commafy( "12345.6789012345678" ) // "12,345.678 901 234 567 8"
Presumably the easiest way is to first split on the decimal point (if there is one). Where best to go from there?
Advertisement
Answer
Just split into two parts with ‘.’ and format them individually.
function commafy( num ) { var str = num.toString().split('.'); if (str[0].length >= 5) { str[0] = str[0].replace(/(d)(?=(d{3})+$)/g, '$1,'); } if (str[1] && str[1].length >= 5) { str[1] = str[1].replace(/(d{3})/g, '$1 '); } return str.join('.'); }