How to format numbers as currency strings

Questions : How to format numbers as currency strings

I would like to format a price in JavaScript. I’d like a function which takes a float as an argument and returns a string formatted like this:

"$ 2,500.00" 

How can I do this?

Total Answers: 66 Answers 66


Popular Answers:

  1. Ok, based on what you said, I’m using this:

    var DecimalSeparator = Number("1.2").toLocaleString().substr(1,1); var AmountWithCommas = Amount.toLocaleString(); var arParts = String(AmountWithCommas).split(DecimalSeparator); var intPart = arParts[0]; var decPart = (arParts.length > 1 ? arParts[1] : ''); decPart = (decPart + '00').substr(0,2); return '£ ' + intPart + DecimalSeparator + decPart; 

    I’m open to improvement suggestions (I’d prefer not to include YUI just to do this 🙂 )

    I already know I should be detecting the “.” instead of just using it as the decimal separator…

  2. Number.prototype.toFixed

    This solution is compatible with every single major browser:

     const profits = 2489.8237; profits.toFixed(3) // Returns 2489.824 (rounds up) profits.toFixed(2) // Returns 2489.82 profits.toFixed(7) // Returns 2489.8237000 (pads the decimals) 

    All you need is to add the currency symbol (e.g. "$" + profits.toFixed(2)) and you will have your amount in dollars.

    Custom function

    If you require the use of , between each digit, you can use this function:

    function formatMoney(number, decPlaces, decSep, thouSep) { decPlaces = isNaN(decPlaces = Math.abs(decPlaces)) ? 2 : decPlaces, decSep = typeof decSep === "undefined" ? "." : decSep; thouSep = typeof thouSep === "undefined" ? "," : thouSep; var sign = number < 0 ? "-" : ""; var i = String(parseInt(number = Math.abs(Number(number) || 0).toFixed(decPlaces))); var j = (j = i.length) > 3 ? j % 3 : 0; return sign + (j ? i.substr(0, j) + thouSep : "") + i.substr(j).replace(/(decSep{3})(?=decSep)/g, "$1" + thouSep) + (decPlaces ? decSep + Math.abs(number - i).toFixed(decPlaces).slice(2) : ""); } document.getElementById("b").addEventListener("click", event => { document.getElementById("x").innerText = "Result was: " + formatMoney(document.getElementById("d").value); });
    <label>Insert your amount: <input id="d" type="text" placeholder="Cash amount" /></label> <br /> <button id="b">Get Output</button> <p id="x">(press button to get output)</p>

    Use it like so:

    (123456789.12345).formatMoney(2, ".", ","); 

    If you’re always going to use ‘.’ and ‘,’, you can leave them off your method call, and the method will default them for you.

    (123456789.12345).formatMoney(2); 

    If your culture has the two symbols flipped (i.e., Europeans) and you would like to use the defaults, just paste over the following two lines in the formatMoney method:

     d = d == undefined ? "," : d, t = t == undefined ? "." : t, 

    Custom function (ES6)

    If you can use modern ECMAScript syntax (i.e., through Babel), you can use this simpler function instead:

    function formatMoney(amount, decimalCount = 2, decimal = ".", thousands = ",") { try { decimalCount = Math.abs(decimalCount); decimalCount = isNaN(decimalCount) ? 2 : decimalCount; const negativeSign = amount < 0 ? "-" : ""; let i = parseInt(amount = Math.abs(Number(amount) || 0).toFixed(decimalCount)).toString(); let j = (i.length > 3) ? i.length % 3 : 0; return negativeSign + (j ? i.substr(0, j) + thousands : '') + i.substr(j).replace(/(d{3})(?=d)/g, "$1" + thousands) + (decimalCount ? decimal + Math.abs(amount - i).toFixed(decimalCount).slice(2) : ""); } catch (e) { console.log(e) } }; document.getElementById("b").addEventListener("click", event => { document.getElementById("x").innerText = "Result was: " + formatMoney(document.getElementById("d").value); });
    <label>Insert your amount: <input id="d" type="text" placeholder="Cash amount" /></label> <br /> <button id="b">Get Output</button> <p id="x">(press button to get output)</p>

  3. Short and fast solution (works everywhere!)

    (12345.67).toFixed(2).replace(/d(?=(d{3})+.)/g, '$&,'); // 12,345.67 

    The idea behind this solution is replacing matched sections with first match and comma, i.e. '$&,'. The matching is done using lookahead approach. You may read the expression as “match a number if it is followed by a sequence of three number sets (one or more) and a dot”.

    TESTS:

    1 --> "1.00" 12 --> "12.00" 123 --> "123.00" 1234 --> "1,234.00" 12345 --> "12,345.00" 123456 --> "123,456.00" 1234567 --> "1,234,567.00" 12345.67 --> "12,345.67" 

    DEMO: http://jsfiddle.net/hAfMM/9571/


    Extended short solution

    You can also extend the prototype of Number object to add additional support of any number of decimals [0 .. n] and the size of number groups [0 .. x]:

    /** * Number.prototype.format(n, x) * * @param integer n: length of decimal * @param integer x: length of sections */ Number.prototype.format = function(n, x) { var re = '\d(?=(\d{' + (x || 3) + '})+' + (n > 0 ? '\.' : '$') + ')'; return this.toFixed(Math.max(0, ~~n)).replace(new RegExp(re, 'g'), '$&,'); }; 1234..format(); // "1,234" 12345..format(2); // "12,345.00" 123456.7.format(3, 2); // "12,34,56.700" 123456.789.format(2, 4); // "12,3456.79" 

    DEMO / TESTS: http://jsfiddle.net/hAfMM/435/


    Super extended short solution

    In this super extended version you may set different delimiter types:

    /** * Number.prototype.format(n, x, s, c) * * @param integer n: length of decimal * @param integer x: length of whole part * @param mixed s: sections delimiter * @param mixed c: decimal delimiter */ Number.prototype.format = function(n, x, s, c) { var re = '\d(?=(\d{' + (x || 3) + '})+' + (n > 0 ? '\D' : '$') + ')', num = this.toFixed(Math.max(0, ~~n)); return (c ? num.replace('.', c) : num).replace(new RegExp(re, 'g'), '$&' + (s || ',')); }; 12345678.9.format(2, 3, '.', ','); // "12.345.678,90" 123456.789.format(4, 4, ' ', ':'); // "12 3456:7890" 12345678.9.format(0, 3, '-'); // "12-345-679" 

    DEMO / TESTS: http://jsfiddle.net/hAfMM/612/

  4. Take a look at the JavaScript Number object and see if it can help you.

    • toLocaleString() will format a number using location specific thousands separator.
    • toFixed() will round the number to a specific number of decimal places.

    To use these at the same time the value must have its type changed back to a number because they both output a string.

    Example:

    Number((someNumber).toFixed(1)).toLocaleString() 

    EDIT

    One can just use toLocaleString directly and its not necessary to recast to a number:

    someNumber.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2}); 

    Multiple numbers

    If you need to frequently format numbers similarly you can create a specific object for reuse. Like for German (Switzerland):

    const money = new Intl.NumberFormat('de-CH', { style:'currency', currency: 'CHF' }); const percent = new Intl.NumberFormat('de-CH', { style:'percent', maximumFractionDigits: 1, signDisplay: "always"}); 

    which than can be used as:

    money.format(1234.50); // output CHF 1'234.50 percent.format(0.083); // output +8.3% 

    Pretty nifty.

  5. Below is the Patrick Desjardins (alias Daok) code with a bit of comments added and some minor changes:

    /* decimal_sep: character used as decimal separator, it defaults to '.' when omitted thousands_sep: char used as thousands separator, it defaults to ',' when omitted */ Number.prototype.toMoney = function(decimals, decimal_sep, thousands_sep) { var n = this, c = isNaN(decimals) ? 2 : Math.abs(decimals), // If decimal is zero we must take it. It means the user does not want to show any decimal d = decimal_sep || '.', // If no decimal separator is passed, we use the dot as default decimal separator (we MUST use a decimal separator) /* According to [https://stackoverflow.com/questions/411352/how-best-to-determine-if-an-argument-is-not-sent-to-the-javascript-function] the fastest way to check for not defined parameter is to use typeof value === 'undefined' rather than doing value === undefined. */ t = (typeof thousands_sep === 'undefined') ? ',' : thousands_sep, // If you don't want to use a thousands separator you can pass empty string as thousands_sep value sign = (n < 0) ? '-' : '', // Extracting the absolute value of the integer part of the number and converting to string i = parseInt(n = Math.abs(n).toFixed(c)) + '', j = ((j = i.length) > 3) ? j % 3 : 0; return sign + (j ? i.substr(0, j) + t : '') + i.substr(j).replace(/(d{3})(?=d)/g, "$1" + t) + (c ? d + Math.abs(n - i).toFixed(c).slice(2) : ''); } 

    And here some tests:

    // Some tests (do not forget parenthesis when using negative numbers and number with no decimals) alert(123456789.67392.toMoney() + 'n' + 123456789.67392.toMoney(3) + 'n' + 123456789.67392.toMoney(0) + 'n' + (123456).toMoney() + 'n' + (123456).toMoney(0) + 'n' + 89.67392.toMoney() + 'n' + (89).toMoney()); // Some tests (do not forget parenthesis when using negative numbers and number with no decimals) alert((-123456789.67392).toMoney() + 'n' + (-123456789.67392).toMoney(-3)); 

    The minor changes are:

    1. moved a bit the Math.abs(decimals) to be done only when is not NaN.

    2. decimal_sep can not be empty string any more (a some sort of decimal separator is a must)

    3. we use typeof thousands_sep === 'undefined' as suggested in How best to determine if an argument is not sent to the JavaScript function

    4. (+n || 0) is not needed because this is a Number object

    JSFiddle

  6. If amount is a number, say -123, then

    amount.toLocaleString('en-US', { style: 'currency', currency: 'USD' }); 

    will produce the string "-$123.00".

    Here’s a complete working example.

  7. accounting.js is a tiny JavaScript library for number, money and currency formatting.

  8. Here’s the best JavaScript money formatter I’ve seen:

    Number.prototype.formatMoney = function(decPlaces, thouSeparator, decSeparator) { var n = this, decPlaces = isNaN(decPlaces = Math.abs(decPlaces)) ? 2 : decPlaces, decSeparator = decSeparator == undefined ? "." : decSeparator, thouSeparator = thouSeparator == undefined ? "," : thouSeparator, sign = n < 0 ? "-" : "", i = parseInt(n = Math.abs(+n || 0).toFixed(decPlaces)) + "", j = (j = i.length) > 3 ? j % 3 : 0; return sign + (j ? i.substr(0, j) + thouSeparator : "") + i.substr(j).replace(/(d{3})(?=d)/g, "$1" + thouSeparator) + (decPlaces ? decSeparator + Math.abs(n - i).toFixed(decPlaces).slice(2) : ""); }; 

    It was reformatted and borrowed from here: How to format numbers as currency strings

    You’ll have to supply your own currency designator (you used $ above).

    Call it like this (although note that the arguments default to 2, comma, and period, so you don’t need to supply any arguments if that’s your preference):

    var myMoney = 3543.75873; var formattedMoney = '$' + myMoney.formatMoney(2, ',', '.'); // "$3,543.76" 
  9. Here’s another attempt, just for fun:

    function formatDollar(num) { var p = num.toFixed(2).split("."); return "$" + p[0].split("").reverse().reduce(function(acc, num, i, orig) { return num + (num != "-" && i && !(i % 3) ? "," : "") + acc; }, "") + "." + p[1]; } 

    And some tests:

    formatDollar(45664544.23423) // "$45,664,544.23" formatDollar(45) // "$45.00" formatDollar(123) // "$123.00" formatDollar(7824) // "$7,824.00" formatDollar(1) // "$1.00" formatDollar(-1345) // "$-1,345.00 formatDollar(-3) // "$-3.00" 
  10. Works for all current browsers

    Use toLocaleString to format a currency in its language-sensitive representation (using ISO 4217 currency codes).

    (2500).toLocaleString("en-GB", {style: "currency", currency: "GBP", minimumFractionDigits: 2}) 

    Example South African Rand code snippets for avenmore:

    console.log((2500).toLocaleString("en-ZA", {style: "currency", currency: "ZAR", minimumFractionDigits: 2})) // -> R 2 500,00 console.log((2500).toLocaleString("en-GB", {style: "currency", currency: "ZAR", minimumFractionDigits: 2})) // -> ZAR 2,500.00

  11. I think you want:

    f.nettotal.value = "$" + showValue.toFixed(2); 
  12. Ok, based on what you said, I’m using this:

    var DecimalSeparator = Number("1.2").toLocaleString().substr(1,1); var AmountWithCommas = Amount.toLocaleString(); var arParts = String(AmountWithCommas).split(DecimalSeparator); var intPart = arParts[0]; var decPart = (arParts.length > 1 ? arParts[1] : ''); decPart = (decPart + '00').substr(0,2); return '£ ' + intPart + DecimalSeparator + decPart; 

    I’m open to improvement suggestions (I’d prefer not to include YUI just to do this 🙂 )

    I already know I should be detecting the “.” instead of just using it as the decimal separator…

  13. just use the native javascript Intl

    you just use the options to format its value

    const number = 1233445.5678 console.log(new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' }).format(number));

    mozilla documentation link

  14. Numeral.js – a JavaScript library for easy number formatting by @adamwdraper

    numeral(23456.789).format('$0,0.00'); // = "$23,456.79" 
  15. The following is concise, easy to understand, and doesn’t rely on any overly complicated regular expressions.

    function moneyFormat(price, sign = '$') { const pieces = parseFloat(price).toFixed(2).split('') let ii = pieces.length - 3 while ((ii-=3) > 0) { pieces.splice(ii, 0, ',') } return sign + pieces.join('') } console.log( moneyFormat(100), moneyFormat(1000), moneyFormat(10000.00), moneyFormat(1000000000000000000) )

    Here is a version with more options in the final output to allow formatting different currencies in different locality formats.

    // higher order function that takes options then a price and will return the formatted price const makeMoneyFormatter = ({ sign = '$', delimiter = ',', decimal = '.', append = false, precision = 2, round = true, custom } = {}) => value => { const e = [1, 10, 100, 1000, 10000, 100000, 1000000, 10000000] value = round ? (Math.round(value * e[precision]) / e[precision]) : parseFloat(value) const pieces = value .toFixed(precision) .replace('.', decimal) .split('') let ii = pieces.length - (precision ? precision + 1 : 0) while ((ii-=3) > 0) { pieces.splice(ii, 0, delimiter) } if (typeof custom === 'function') { return custom({ sign, float: value, value: pieces.join('') }) } return append ? pieces.join('') + sign : sign + pieces.join('') } // create currency converters with the correct formatting options const formatDollar = makeMoneyFormatter() const formatPound = makeMoneyFormatter({ sign: '£', precision: 0 }) const formatEuro = makeMoneyFormatter({ sign: '€', delimiter: '.', decimal: ',', append: true }) const customFormat = makeMoneyFormatter({ round: false, custom: ({ value, float, sign }) => `SALE:$${value}USD` }) console.log( formatPound(1000), formatDollar(10000.0066), formatEuro(100000.001), customFormat(999999.555) )

  16. I use the library Globalize (from Microsoft):

    It’s a great project to localize numbers, currencies and dates and to have them automatically formatted the right way according to the user locale! …and despite it should be a jQuery extension, it’s currently a 100% independent library. I suggest you all to try it out! 🙂

  17. A shorter method (for inserting space, comma or point) with a regular expression:

     Number.prototype.toCurrencyString = function(){ return this.toFixed(2).replace(/(d)(?=(d{3})+b)/g, '$1 '); } n = 12345678.9; alert(n.toCurrencyString()); 
  18. +1 to Jonathan M for providing the original method. Since this is explicitly a currency formatter, I went ahead and added the currency symbol (defaults to ‘$’) to the output, and added a default comma as the thousands separator. If you don’t actually want a currency symbol (or thousands separator), just use “” (empty string) as your argument for it.
  19. <script type="text/javascript"> function ins1000Sep(val) { val = val.split("."); val[0] = val[0].split("").reverse().join(""); val[0] = val[0].replace(/(d{3})/g, "$1,"); val[0] = val[0].split("").reverse().join(""); val[0] = val[0].indexOf(",") == 0 ? val[0].substring(1) : val[0]; return val.join("."); } function rem1000Sep(val) { return val.replace(/,/g, ""); } function formatNum(val) { val = Math.round(val*100)/100; val = ("" + val).indexOf(".") > -1 ? val + "00" : val + ".00"; var dec = val.indexOf("."); return dec == val.length-3 || dec == 0 ? val : val.substring(0, dec+3); } </script> <button onclick="alert(ins1000Sep(formatNum(12313231)));">
  20. Please try the below code

    "250000".replace(/(d)(?=(d{3})+(?!d))/g, '$1,'); 

    Ans: 250,000

    Enter image description here

  21. There is a JavaScript port of the PHP function “number_format”.

    I find it very useful as it is easy to use and recognisable for PHP developers.

    function number_format (number, decimals, dec_point, thousands_sep) { var n = number, prec = decimals; var toFixedFix = function (n,prec) { var k = Math.pow(10,prec); return (Math.round(n*k)/k).toString(); }; n = !isFinite(+n) ? 0 : +n; prec = !isFinite(+prec) ? 0 : Math.abs(prec); var sep = (typeof thousands_sep === 'undefined') ? ',' : thousands_sep; var dec = (typeof dec_point === 'undefined') ? '.' : dec_point; var s = (prec > 0) ? toFixedFix(n, prec) : toFixedFix(Math.round(n), prec); // Fix for Internet Explorer parseFloat(0.55).toFixed(0) = 0; var abs = toFixedFix(Math.abs(n), prec); var _, i; if (abs >= 1000) { _ = abs.split(/D/); i = _[0].length % 3 || 3; _[0] = s.slice(0,i + (n < 0)) + _[0].slice(i).replace(/(d{3})/g, sep+'$1'); s = _.join(dec); } else { s = s.replace('.', dec); } var decPos = s.indexOf(dec); if (prec >= 1 && decPos !== -1 && (s.length-decPos-1) < prec) { s += new Array(prec-(s.length-decPos-1)).join(0)+'0'; } else if (prec >= 1 && decPos === -1) { s += dec+new Array(prec).join(0)+'0'; } return s; } 

    (Comment block from the original, included below for examples & credit where due)

    // Formats a number with grouped thousands // // version: 906.1806 // discuss at: http://phpjs.org/functions/number_format // + original by: Jonas Raoni Soares Silva (http://www.jsfromhell.com) // + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) // + bugfix by: Michael White (http://getsprink.com) // + bugfix by: Benjamin Lupton // + bugfix by: Allan Jensen (http://www.winternet.no) // + revised by: Jonas Raoni Soares Silva (http://www.jsfromhell.com) // + bugfix by: Howard Yeend // + revised by: Luke Smith (http://lucassmith.name) // + bugfix by: Diogo Resende // + bugfix by: Rival // + input by: Kheang Hok Chin (http://www.distantia.ca/) // + improved by: davook // + improved by: Brett Zamir (http://brett-zamir.me) // + input by: Jay Klehr // + improved by: Brett Zamir (http://brett-zamir.me) // + input by: Amir Habibi (http://www.residence-mixte.com/) // + bugfix by: Brett Zamir (http://brett-zamir.me) // * example 1: number_format(1234.56); // * returns 1: '1,235' // * example 2: number_format(1234.56, 2, ',', ' '); // * returns 2: '1 234,56' // * example 3: number_format(1234.5678, 2, '.', ''); // * returns 3: '1234.57' // * example 4: number_format(67, 2, ',', '.'); // * returns 4: '67,00' // * example 5: number_format(1000); // * returns 5: '1,000' // * example 6: number_format(67.311, 2); // * returns 6: '67.31' // * example 7: number_format(1000.55, 1); // * returns 7: '1,000.6' // * example 8: number_format(67000, 5, ',', '.'); // * returns 8: '67.000,00000' // * example 9: number_format(0.9, 0); // * returns 9: '1' // * example 10: number_format('1.20', 2); // * returns 10: '1.20' // * example 11: number_format('1.20', 4); // * returns 11: '1.2000' // * example 12: number_format('1.2000', 3); // * returns 12: '1.200' 
  22. Patrick Desjardins‘ answer looks good, but I prefer my JavaScript code simple. Here’s a function I just wrote to take a number in and return it in currency format (minus the dollar sign):

    // Format numbers to two decimals with commas function formatDollar(num) { var p = num.toFixed(2).split("."); var chars = p[0].split("").reverse(); var newstr = ''; var count = 0; for (x in chars) { count++; if(count%3 == 1 && count != 1) { newstr = chars[x] + ',' + newstr; } else { newstr = chars[x] + newstr; } } return newstr + "." + p[1]; } 
  23. There is a built-in function, toFixed, in JavaScript:

    var num = new Number(349); document.write("$" + num.toFixed(2)); 
  24. function CurrencyFormatted(amount) { var i = parseFloat(amount); if(isNaN(i)) { i = 0.00; } var minus = ''; if(i < 0) { minus = '-'; } i = Math.abs(i); i = parseInt((i + .005) * 100); i = i / 100; s = new String(i); if(s.indexOf('.') < 0) { s += '.00'; } if(s.indexOf('.') == (s.length - 2)) { s += '0'; } s = minus + s; return s; } 

    From WillMaster.

  25. I suggest the NumberFormat class from Google Visualization API.

    You can do something like this:

    var formatter = new google.visualization.NumberFormat({ prefix: '$', pattern: '#,###,###.##' }); formatter.formatValue(1000000); // $ 1,000,000 
  26. As usually, there are multiple ways of doing the same thing, but I would avoid using Number.prototype.toLocaleString since it can return different values based on the user settings.

    I also don’t recommend extending the Number.prototype – extending native objects prototypes is a bad practice since it can cause conflicts with other people code (e.g. libraries/frameworks/plugins) and may not be compatible with future JavaScript implementations/versions.

    I believe that regular expressions are the best approach for the problem, here is my implementation:

    /** * Converts number into currency format * @param {number} number Number that should be converted. * @param {string} [decimalSeparator] Decimal separator, defaults to '.'. * @param {string} [thousandsSeparator] Thousands separator, defaults to ','. * @param {int} [nDecimalDigits] Number of decimal digits, defaults to `2`. * @return {string} Formatted string (e.g. numberToCurrency(12345.67) returns '12,345.67') */ function numberToCurrency(number, decimalSeparator, thousandsSeparator, nDecimalDigits){ //default values decimalSeparator = decimalSeparator || '.'; thousandsSeparator = thousandsSeparator || ','; nDecimalDigits = nDecimalDigits == null? 2 : nDecimalDigits; var fixed = number.toFixed(nDecimalDigits), //limit/add decimal digits parts = new RegExp('^(-?\d{1,3})((?:\d{3})+)(\.(\d{'+ nDecimalDigits +'}))?$').exec( fixed ); //separate begin [$1], middle [$2] and decimal digits [$4] if(parts){ //number >= 1000 || number <= -1000 return parts[1] + parts[2].replace(/d{3}/g, thousandsSeparator + '$&') + (parts[4] ? decimalSeparator + parts[4] : ''); }else{ return fixed.replace('.', decimalSeparator); } } 
  27. This might be a little late, but here’s a method I just worked up for a coworker to add a locale-aware .toCurrencyString() function to all numbers. The internalization is for number grouping only, not the currency sign – if you’re outputting dollars, use "$" as supplied, because $123 4567 in Japan or China is the same number of USD as $1,234,567 is in the US. If you’re outputting euro, etc., then change the currency sign from "$".

    Declare this anywhere in your HTML <head> section or wherever necessary, just before you need to use it:

     Number.prototype.toCurrencyString = function(prefix, suffix) { if (typeof prefix === 'undefined') { prefix = '$'; } if (typeof suffix === 'undefined') { suffix = ''; } var _localeBug = new RegExp((1).toLocaleString().replace(/^1/, '').replace(/./, '\.') + "$"); return prefix + (~~this).toLocaleString().replace(_localeBug, '') + (this % 1).toFixed(2).toLocaleString().replace(/^[+-]?0+/,'') + suffix; } 

    Then you’re done! Use (number).toCurrencyString() anywhere you need to output the number as currency.

    var MyNumber = 123456789.125; alert(MyNumber.toCurrencyString()); // alerts "$123,456,789.13" MyNumber = -123.567; alert(MyNumber.toCurrencyString()); // alerts "$-123.57" 
  28. Number(value) .toFixed(2) .replace(/(d)(?=(d{3})+(?!d))/g, "$1,")

  29. Here are some solutions and all pass the test suite. The test suite and benchmark are included. If you want copy and paste to test, try this gist.

    Method 0 (RegExp)

    It is based on VisioN’s answer, but it fixes if there isn’t a decimal point.

    if (typeof Number.prototype.format === 'undefined') { Number.prototype.format = function (precision) { if (!isFinite(this)) { return this.toString(); } var a = this.toFixed(precision).split('.'); a[0] = a[0].replace(/d(?=(d{3})+$)/g, '$&,'); return a.join('.'); } } 

    Method 1

    if (typeof Number.prototype.format === 'undefined') { Number.prototype.format = function (precision) { if (!isFinite(this)) { return this.toString(); } var a = this.toFixed(precision).split('.'), // Skip the '-' sign head = Number(this < 0); // Skip the digits that's before the first thousands separator head += (a[0].length - head) % 3 || 3; a[0] = a[0].slice(0, head) + a[0].slice(head).replace(/d{3}/g, ',$&'); return a.join('.'); }; } 

    Method 2 (Split to Array)

    if (typeof Number.prototype.format === 'undefined') { Number.prototype.format = function (precision) { if (!isFinite(this)) { return this.toString(); } var a = this.toFixed(precision).split('.'); a[0] = a[0] .split('').reverse().join('') .replace(/d{3}(?=d)/g, '$&,') .split('').reverse().join(''); return a.join('.'); }; } 

    Method 3 (Loop)

    if (typeof Number.prototype.format === 'undefined') { Number.prototype.format = function (precision) { if (!isFinite(this)) { return this.toString(); } var a = this.toFixed(precision).split(''); a.push('.'); var i = a.indexOf('.') - 3; while (i > 0 && a[i-1] !== '-') { a.splice(i, 0, ','); i -= 3; } a.pop(); return a.join(''); }; } 

    Usage Example

    console.log('======== Demo ========') console.log( (1234567).format(0), (1234.56).format(2), (-1234.56).format(0) ); var n = 0; for (var i=1; i<20; i++) { n = (n * 10) + (i % 10)/100; console.log(n.format(2), (-n).format(2)); } 

    Separator

    If we want custom a thousands separator or decimal separator, use replace():

    123456.78.format(2).replace(',', ' ').replace('.', ' '); 

    Test suite

    function assertEqual(a, b) { if (a !== b) { throw a + ' !== ' + b; } } function test(format_function) { console.log(format_function); assertEqual('NaN', format_function.call(NaN, 0)) assertEqual('Infinity', format_function.call(Infinity, 0)) assertEqual('-Infinity', format_function.call(-Infinity, 0)) assertEqual('0', format_function.call(0, 0)) assertEqual('0.00', format_function.call(0, 2)) assertEqual('1', format_function.call(1, 0)) assertEqual('-1', format_function.call(-1, 0)) // Decimal padding assertEqual('1.00', format_function.call(1, 2)) assertEqual('-1.00', format_function.call(-1, 2)) // Decimal rounding assertEqual('0.12', format_function.call(0.123456, 2)) assertEqual('0.1235', format_function.call(0.123456, 4)) assertEqual('-0.12', format_function.call(-0.123456, 2)) assertEqual('-0.1235', format_function.call(-0.123456, 4)) // Thousands separator assertEqual('1,234', format_function.call(1234.123456, 0)) assertEqual('12,345', format_function.call(12345.123456, 0)) assertEqual('123,456', format_function.call(123456.123456, 0)) assertEqual('1,234,567', format_function.call(1234567.123456, 0)) assertEqual('12,345,678', format_function.call(12345678.123456, 0)) assertEqual('123,456,789', format_function.call(123456789.123456, 0)) assertEqual('-1,234', format_function.call(-1234.123456, 0)) assertEqual('-12,345', format_function.call(-12345.123456, 0)) assertEqual('-123,456', format_function.call(-123456.123456, 0)) assertEqual('-1,234,567', format_function.call(-1234567.123456, 0)) assertEqual('-12,345,678', format_function.call(-12345678.123456, 0)) assertEqual('-123,456,789', format_function.call(-123456789.123456, 0)) // Thousands separator and decimal assertEqual('1,234.12', format_function.call(1234.123456, 2)) assertEqual('12,345.12', format_function.call(12345.123456, 2)) assertEqual('123,456.12', format_function.call(123456.123456, 2)) assertEqual('1,234,567.12', format_function.call(1234567.123456, 2)) assertEqual('12,345,678.12', format_function.call(12345678.123456, 2)) assertEqual('123,456,789.12', format_function.call(123456789.123456, 2)) assertEqual('-1,234.12', format_function.call(-1234.123456, 2)) assertEqual('-12,345.12', format_function.call(-12345.123456, 2)) assertEqual('-123,456.12', format_function.call(-123456.123456, 2)) assertEqual('-1,234,567.12', format_function.call(-1234567.123456, 2)) assertEqual('-12,345,678.12', format_function.call(-12345678.123456, 2)) assertEqual('-123,456,789.12', format_function.call(-123456789.123456, 2)) } console.log('======== Testing ========'); test(Number.prototype.format); test(Number.prototype.format1); test(Number.prototype.format2); test(Number.prototype.format3); 

    Benchmark

    function benchmark(f) { var start = new Date().getTime(); f(); return new Date().getTime() - start; } function benchmark_format(f) { console.log(f); time = benchmark(function () { for (var i = 0; i < 100000; i++) { f.call(123456789, 0); f.call(123456789, 2); } }); console.log(time.format(0) + 'ms'); } // If not using async, the browser will stop responding while running. // This will create a new thread to benchmark async = []; function next() { setTimeout(function () { f = async.shift(); f && f(); next(); }, 10); } console.log('======== Benchmark ========'); async.push(function () { benchmark_format(Number.prototype.format); }); next(); 
  30. I found this from: accounting.js. It’s very easy and perfectly fits my need.

    // Default usage: accounting.formatMoney(12345678); // $12,345,678.00 // European formatting (custom symbol and separators), can also use options object as second parameter: accounting.formatMoney(4999.99, "€", 2, ".", ","); // €4.999,99 // Negative values can be formatted nicely: accounting.formatMoney(-500000, "£ ", 0); // £ -500,000 // Simple `format` string allows control of symbol position (%v = value, %s = symbol): accounting.formatMoney(5318008, { symbol: "GBP", format: "%v %s" }); // 5,318,008.00 GBP // Euro currency symbol to the right accounting.formatMoney(5318008, {symbol: "€", precision: 2, thousand: ".", decimal : ",", format: "%v%s"}); // 1.008,00€ 

  31. A simple option for proper comma placement by reversing the string first and basic regexp.

    String.prototype.reverse = function() { return this.split('').reverse().join(''); }; Number.prototype.toCurrency = function( round_decimal /*boolean*/ ) { // format decimal or round to nearest integer var n = this.toFixed( round_decimal ? 0 : 2 ); // convert to a string, add commas every 3 digits from left to right  // by reversing string return (n + '').reverse().replace( /(d{3})(?=d)/g, '$1,' ).reverse(); }; 
  32. The YUI codebase uses the following formatting:

    format: function(nData, oConfig) { oConfig = oConfig || {}; if(!YAHOO.lang.isNumber(nData)) { nData *= 1; } if(YAHOO.lang.isNumber(nData)) { var sOutput = nData + ""; var sDecimalSeparator = (oConfig.decimalSeparator) ? oConfig.decimalSeparator : "."; var nDotIndex; // Manage decimals if(YAHOO.lang.isNumber(oConfig.decimalPlaces)) { // Round to the correct decimal place var nDecimalPlaces = oConfig.decimalPlaces; var nDecimal = Math.pow(10, nDecimalPlaces); sOutput = Math.round(nData*nDecimal)/nDecimal + ""; nDotIndex = sOutput.lastIndexOf("."); if(nDecimalPlaces > 0) { // Add the decimal separator if(nDotIndex < 0) { sOutput += sDecimalSeparator; nDotIndex = sOutput.length-1; } // Replace the "." else if(sDecimalSeparator !== "."){ sOutput = sOutput.replace(".",sDecimalSeparator); } // Add missing zeros while((sOutput.length - 1 - nDotIndex) < nDecimalPlaces) { sOutput += "0"; } } } // Add the thousands separator if(oConfig.thousandsSeparator) { var sThousandsSeparator = oConfig.thousandsSeparator; nDotIndex = sOutput.lastIndexOf(sDecimalSeparator); nDotIndex = (nDotIndex > -1) ? nDotIndex : sOutput.length; var sNewOutput = sOutput.substring(nDotIndex); var nCount = -1; for (var i=nDotIndex; i>0; i--) { nCount++; if ((nCount%3 === 0) && (i !== nDotIndex)) { sNewOutput = sThousandsSeparator + sNewOutput; } sNewOutput = sOutput.charAt(i-1) + sNewOutput; } sOutput = sNewOutput; } // Prepend prefix sOutput = (oConfig.prefix) ? oConfig.prefix + sOutput : sOutput; // Append suffix sOutput = (oConfig.suffix) ? sOutput + oConfig.suffix : sOutput; return sOutput; } // Still not a number. Just return it unaltered else { return nData; } } 

    It would need editing as the YUI library is configurable, like replacing oConfig.decimalSeparator with “.”.

  33. Patrick Desjardins (ex Daok)’s example worked well for me. I ported it over to CoffeeScript if anyone is interested.

    Number.prototype.toMoney = (decimals = 2, decimal_separator = ".", thousands_separator = ",") -> n = this c = if isNaN(decimals) then 2 else Math.abs decimals sign = if n < 0 then "-" else "" i = parseInt(n = Math.abs(n).toFixed(c)) + '' j = if (j = i.length) > 3 then j % 3 else 0 x = if j then i.substr(0, j) + thousands_separator else '' y = i.substr(j).replace(/(d{3})(?=d)/g, "$1" + thousands_separator) z = if c then decimal_separator + Math.abs(n - i).toFixed(c).slice(2) else '' sign + x + y + z 
  34. function formatMoney(n) { return "$ " + (Math.round(n * 100) / 100).toLocaleString(); }
  35. tggagne is correct. My solution below is not good due to float rounding. And the toLocaleString function lacks some browser support. I’ll leave the below comments for archival purposes of what not to do. 🙂

    Date.prototype.toLocaleString()

    (Old Solution) Use Patrick Desjardins’ solution instead.

    This is a terse solution that uses toLocaleString(), which has been supported since JavaScript version 1.0. This example designates the currency to U.S. Dollars, but could be switched to pounds by using ‘GBP’ instead of ‘USD’.

    var formatMoney = function (value) { // Convert the value to a floating point number in case it arrives as a string. var numeric = parseFloat(value); // Specify the local currency. return numeric.toLocaleString('USD', { style: 'currency', currency: "USD", minimumFractionDigits: 2, maximumFractionDigits: 2 }); } 

    See Internationalization and localization, Currencies for additional details.

  36. A function to handle currency output, including negatives.

    Sample Output:
    $5.23
    -$5.23

    function formatCurrency(total) { var neg = false; if(total < 0) { neg = true; total = Math.abs(total); } return (neg ? "-$" : '$') + parseFloat(total, 10).toFixed(2).replace(/(d)(?=(d{3})+.)/g, "$1,").toString(); } 
  37. Another way:

    function centsToDollaString(x){ var cents = x + "" while(cents.length < 4){ cents = "0" + cents; } var dollars = cents.substr(0,cents.length - 2) var decimal = cents.substr(cents.length - 2, 2) while(dollars.length % 3 != 0){ dollars = "0" + dollars; } str = dollars.replace(/(d{3})(?=d)/g, "$1" + ",").replace(/^0*(?=.)/, ""); return "$" + str + "." + decimal; } 
  38. We can also use numeraljs

    Numbers can be formatted to look like currency, percentages, times, or even plain old numbers with decimal places, thousands, and abbreviations. And you can always create a custom format.

    var string = numeral(1000).format('0,0'); // '1,000' 
  39. http://code.google.com/p/javascript-number-formatter/:

    • Short, fast, flexible yet stand-alone. Only 75 lines including MIT license info, blank lines & comments.
    • Accept standard number formatting like #,##0.00 or with negation -000.####.
    • Accept any country format like # ##0,00, #,###.##, #’###.## or any type of non-numbering symbol.
    • Accept any numbers of digit grouping. #,##,#0.000 or #,###0.## are all valid.
    • Accept any redundant/fool-proof formatting. ##,###,##.# or 0#,#00#.###0# are all OK.
    • Auto number rounding.
    • Simple interface, just supply mask & value like this: format( “0.0000”, 3.141592)

    UPDATE This is my home-grown pp utilities for most common tasks:

    var NumUtil = {}; /** Petty print 'num' wth exactly 'signif' digits. pp(123.45, 2) == "120" pp(0.012343, 3) == "0.0123" pp(1.2, 3) == "1.20" */ NumUtil.pp = function(num, signif) { if (typeof(num) !== "number") throw 'NumUtil.pp: num is not a number!'; if (isNaN(num)) throw 'NumUtil.pp: num is NaN!'; if (num < 1e-15 || num > 1e15) return num; var r = Math.log(num)/Math.LN10; var dot = Math.floor(r) - (signif-1); r = r - Math.floor(r) + (signif-1); r = Math.round(Math.exp(r * Math.LN10)).toString(); if (dot >= 0) { for (; dot > 0; dot -= 1) r += "0"; return r; } else if (-dot >= r.length) { var p = "0."; for (; -dot > r.length; dot += 1) { p += "0"; } return p+r; } else { return r.substring(0, r.length + dot) + "." + r.substring(r.length + dot); } } /** Append leading zeros up to 2 digits. */ NumUtil.align2 = function(v) { if (v < 10) return "0"+v; return ""+v; } /** Append leading zeros up to 3 digits. */ NumUtil.align3 = function(v) { if (v < 10) return "00"+v; else if (v < 100) return "0"+v; return ""+v; } NumUtil.integer = {}; /** Round to integer and group by 3 digits. */ NumUtil.integer.pp = function(num) { if (typeof(num) !== "number") { console.log("%s", new Error().stack); throw 'NumUtil.integer.pp: num is not a number!'; } if (isNaN(num)) throw 'NumUtil.integer.pp: num is NaN!'; if (num > 1e15) return num; if (num < 0) throw 'Negative num!'; num = Math.round(num); var group = num % 1000; var integ = Math.floor(num / 1000); if (integ === 0) { return group; } num = NumUtil.align3(group); while (true) { group = integ % 1000; integ = Math.floor(integ / 1000); if (integ === 0) return group + " " + num; num = NumUtil.align3(group) + " " + num; } return num; } NumUtil.currency = {}; /** Round to coins and group by 3 digits. */ NumUtil.currency.pp = function(amount) { if (typeof(amount) !== "number") throw 'NumUtil.currency.pp: amount is not a number!'; if (isNaN(amount)) throw 'NumUtil.currency.pp: amount is NaN!'; if (amount > 1e15) return amount; if (amount < 0) throw 'Negative amount!'; if (amount < 1e-2) return 0; var v = Math.round(amount*100); var integ = Math.floor(v / 100); var frac = NumUtil.align2(v % 100); var group = integ % 1000; integ = Math.floor(integ / 1000); if (integ === 0) { return group + "." + frac; } amount = NumUtil.align3(group); while (true) { group = integ % 1000; integ = Math.floor(integ / 1000); if (integ === 0) return group + " " + amount + "." + frac; amount = NumUtil.align3(group) + " " + amount; } return amount; } 
  40. Intl.NumberFormat

    var number = 3500; alert(new Intl.NumberFormat().format(number)); // → "3,500" if in US English locale 

    Or PHP’s number_format in JavaScript.

  41. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/NumberFormat Example: Using locales

    This example shows some of the variations in localized number formats. In order to get the format of the language used in the user interface of your application, make sure to specify that language (and possibly some fallback languages) using the locales argument:

    var number = 123456.789;

    // German uses comma as decimal separator and period for thousands console.log(new Intl.NumberFormat(‘de-DE’).format(number)); // → 123.456,789

    // Arabic in most Arabic speaking countries uses real Arabic digits console.log(new Intl.NumberFormat(‘ar-EG’).format(number)); // → ١٢٣٤٥٦٫٧٨٩

    // India uses thousands/lakh/crore separators console.log(new Intl.NumberFormat(‘en-IN’).format(number));

  42. This answer meets the following criteria:

    • Does not depend on an external dependency.
    • Does support localization.
    • Does have tests/proofs.
    • Does use simple and best coding practices (no complicated regex’s and uses standard coding patterns).

    This code is built on concepts from other answers. Its execution speed should be among the better posted here if that’s a concern.

    var decimalCharacter = Number("1.1").toLocaleString().substr(1,1); var defaultCurrencyMarker = "$"; function formatCurrency(number, currencyMarker) { if (typeof number != "number") number = parseFloat(number, 10); // if NaN is passed in or comes from the parseFloat, set it to 0. if (isNaN(number)) number = 0; var sign = number < 0 ? "-" : ""; number = Math.abs(number); // so our signage goes before the $ symbol. var integral = Math.floor(number); var formattedIntegral = integral.toLocaleString(); // IE returns "##.00" while others return "##" formattedIntegral = formattedIntegral.split(decimalCharacter)[0]; var decimal = Math.round((number - integral) * 100); return sign + (currencyMarker || defaultCurrencyMarker) + formattedIntegral + decimalCharacter + decimal.toString() + (decimal < 10 ? "0" : ""); } 

    These tests only work on a US locale machine. This decision was made for simplicity and because this could cause of crappy input (bad auto-localization) allowing for crappy output issues.

    var tests = [ // [ input, expected result ] [123123, "$123,123.00"], // no decimal [123123.123, "$123,123.12"], // decimal rounded down [123123.126, "$123,123.13"], // decimal rounded up [123123.4, "$123,123.40"], // single decimal ["123123", "$123,123.00"], // repeat subset of the above using string input. ["123123.123", "$123,123.12"], ["123123.126", "$123,123.13"], [-123, "-$123.00"] // negatives ]; for (var testIndex=0; testIndex < tests.length; testIndex++) { var test = tests[testIndex]; var formatted = formatCurrency(test[0]); if (formatted == test[1]) { console.log("Test passed, "" + test[0] + """" resulted in """" + formatted + """"""); } else { console.error(""Test failed. Expected """" + test[1] + """"
  43. got """" + formatted + """"""); } }

  44. Here is the short and best one to convert numbers into a currency format:

    function toCurrency(amount){ return amount.replace(/(d)(?=(ddd)+(?!d))/g, "$1,"); } // usage: toCurrency(3939920.3030); 
  45. Number.prototype.formatNumber = function(decPlaces, thouSeparator, decSeparator) { decPlaces = isNaN(decPlaces = Math.abs(decPlaces)) ? 2 : decPlaces; decSeparator = decSeparator == undefined ? "." : decSeparator; thouSeparator = thouSeparator == undefined ? "," : thouSeparator; var n = this.toFixed(decPlaces); if (decPlaces) { var i = n.substr(0, n.length - (decPlaces + 1)); var j = decSeparator + n.substr(-decPlaces); } else { i = n; j = ''; } function reverse(str) { var sr = ''; for (var l = str.length - 1; l >= 0; l--) { sr += str.charAt(l); } return sr; } if (parseInt(i)) { i = reverse(reverse(i).replace(/(d{3})(?=d)/g, "$1" + thouSeparator)); } return i + j; };
  46. toLocaleString is good, but it doesn’t work in all browsers. I usually use currencyFormatter.js (https://osrec.github.io/currencyFormatter.js/). It’s pretty lightweight and contains all the currency and locale definitions right out of the box. It’s also good at formatting unusually formatted currencies, such as the INR (which groups numbers in lakhs, crores, etc.). Also, there aren’t any dependencies!

    OSREC.CurrencyFormatter.format(2534234, { currency: 'INR' }); // Returns ₹ 25,34,234.00

    OSREC.CurrencyFormatter.format(2534234, { currency: 'EUR' }); // Returns 2.534.234,00 €

    OSREC.CurrencyFormatter.format(2534234, { currency: 'EUR', locale: 'fr' }); // Returns 2 534 234,00 €

  47. This might work:

    function format_currency(v, number_of_decimals, decimal_separator, currency_sign){ return (isNaN(v)? v : currency_sign + parseInt(v||0).toLocaleString() + decimal_separator + (v*1).toFixed(number_of_decimals).slice(-number_of_decimals)); } 

    No loops, no regexes, no arrays, no exotic conditionals.

Tasg: javascript, formatting

Answer Link
jidam
  • Unable to run NoraUI mvn verify goal
  • Unable to run my app on emulator in VS Code
  • Unable to run multiple instances of libVLC(MobileVLCKit) in IOS via flutter framework
  • Unable to run make on griddb source on ubuntu 20.04 (building from source)
  • Unable to run latexindent macOS Monterey 12.0.1
  • Unable to run kotlinc-native command
  • Unable to run JUnit Test… Java.lang.ExceptionInInitializerError (Android Studio)
  • Unable to run java with -Xmx > 966m
  • Unable to run ionic cap run android from wsl2 inorder to start android emulator
  • Unable to run Intel HAXM installer: Cannot start process, the working directory does not exist
  • fs
  • Unable to run Google Analytics sample code
  • unable to run flutter run after upgarding to flutter 2.8.0 from 2.5.3
  • Unable to run Django with PostgreSQL in Docker
  • Unable to Run Container Using testcontainers
  • Unable to run ClojureScript Hello World program, Error building classpath. Error reading edn.
  • unable to run client command for apache karaf 4.3.3 through remote server
  • Unable to run c program 2nd time using eclipse
  • unable to run c++ in visual studio code on m1 chipset
  • Unable to run Android Instrumented Tests
  • Unable to run adb, check your Android SDK installation and ANDROID_SDK_ROOT environment variable: …AndroidSdkplatform-toolsadb.exe
  • Unable to run a singlespecific .spec.ts file through angular cli using ng test –include option
  • Unable to run a Mango query
  • Unable to return response back to view in laravel from package
  • Unable to return object reference in std::optional
  • Unable to return NULL in a function that expects an integer return type
  • Unable to return correct change in JavaScript Cash Register
  • Unable to retrieve version information from Elasticsearch nodes. Request timed out
  • Unable to retrieve values from Axios Response data
  • Unable to retrieve dotenv JWT secret Error: secretOrPrivateKey must have a value
  • Unable to resolve your shell environment
  • Unable to resolve token for FCM while implementing Push notification for Xamarin
  • Unable to resolve the request yii
  • Unable to resolve service for type Swashbuckle.AspNetCore.Swagger.ISwaggerProvider
  • Unable to resolve service for type Microsoft.EntityFrameworkCore.Diagnostics.IDiagnosticsLogger