Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<blockquote> <p>I have decided to completely rewrite example I did in 2009. <strong>Please check <a href="https://stackoverflow.com/posts/1726759/revisions">diff</a> if interested in older version</strong>. In order to achieve functionality like previous answer, I have extracted a part of the <code>Money</code> library I am working on.</p> <p><em>I also don't remember why I have recreated <code>toFixed</code> last time as that method was already present. This time it is not included.</em></p> </blockquote> <p>Instead of messing with <code>String</code> and <code>Number</code> objects in javascript, like last time, I am creating new, <code>Money</code>, object.</p> <pre><code>(function() { window.Money = (function() { Money.prototype.amount = 0.0; Money.prototype.fraction_count = 2; Money.prototype.fraction_separator = ","; Money.prototype.separate_thousands = true; Money.prototype.symbol = "€"; Money.prototype.symbol_position = "front"; Money.prototype.symbol_spacing = false; Money.prototype.thousands_separator = "."; function Money(amount, options) { var o; if (options == null) { options = {}; } for (o in options) { this[o] = options[o]; } amount = parseFloat(amount); if (!isNaN(amount)) { this.amount = amount; } this.format(); } Money.prototype.format = function() { this.string_amount = this.amount.toFixed(this.fraction_count); if (this.separate_thousands) { this.string_amount = this.separateThousands(); } return this.string = this.addSymbol(); }; Money.prototype.separateThousands = function() { var after_dot, before_dot, pattern, _ref; _ref = this.string_amount.split("."), before_dot = _ref[0], after_dot = _ref[1]; pattern = /(-?\d+)(\d{3})/; while (pattern.test(before_dot)) { before_dot = before_dot.replace(pattern, "$1" + this.thousands_separator + "$2"); } return [before_dot, after_dot].join(this.fraction_separator); }; Money.prototype.addSymbol = function() { var string; string = [this.string_amount]; string.splice((this.symbol_position === "front" ? 0 : 1), 0, this.symbol); return string.join(this.symbol_spacing ? " " : ""); }; return Money; })(); </code></pre> <p>Now, I do need to modify <code>Number</code> and/or <code>String</code> objects slightly and add <code>toMoney</code> method.</p> <pre><code>Number.prototype.toMoney = function(options) { return new Money(this, options); }; String.prototype.toMoney = function(options) { return new Money(this, options); }; </code></pre> <p>So, finally, we can convert <code>String</code> and/or <code>Number</code> to <code>Money</code> and write it out as <code>String</code> again.</p> <pre><code>x = "1234567890.0987654321".toMoney(); y = 1234567890.0987654321.toMoney({fraction_count: 5, symbol: "$", symbol_position: "back"}); console.log(x); // Money {amount: 1234567890.0987654, string_amount: "1.234.567.890,10", string: "€1.234.567.890,10"} console.log(x.string) // €1.234.567.890,10 console.log(y); // Money {fraction_count: 5, symbol: "$", symbol_position: "back", amount: 1234567890.0987654, string_amount: "1.234.567.890,09877"…} console.log(y.string) // 1.234.567.890,09877$ </code></pre> <p>I think this solution is much better than the last one I wrote. For working example check <a href="http://jsfiddle.net/pQzRZ/" rel="nofollow noreferrer">jsFiddle</a>.</p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload