[
  {
    "path": ".cjsescache",
    "content": "{\n  \"src/format.js\": null\n}"
  },
  {
    "path": ".eslintrc",
    "content": "{\n  \"env\": {\n    \"browser\": true,\n    \"es6\": true\n  },\n  \"parserOptions\": {\n    \"ecmaVersion\": 2017,\n    \"sourceType\": \"module\"\n  },\n  \"rules\": {\n    \"curly\": 1,\n    \"dot-location\": [2,\"property\"],\n    \"eqeqeq\": 1,\n    \"linebreak-style\": [2, \"unix\"],\n    \"no-else-return\": 1,\n    \"no-eval\": 2,\n    \"no-octal\": 2,\n    \"no-with\": 2,\n    \"radix\": 2,\n    \"brace-style\": 1,\n    \"camelcase\": 2,\n    \"indent\": [2, \"tab\"],\n    \"no-array-constructor\": 2,\n    \"quotes\": [2, \"double\", {\n      \"allowTemplateLiterals\": true,\n      \"avoidEscape\": true\n    }],\n    \"quote-props\": 0,\n    \"spaced-comment\": 2,\n    \"arrow-spacing\": 2,\n    \"no-var\": 2,\n    \"no-unused-vars\": 1\n  }\n}\n"
  },
  {
    "path": ".gitattributes",
    "content": "* text=auto\n"
  },
  {
    "path": ".gitignore",
    "content": "# lockfiles\npackage-lock.json\nyarn.lock\n\n# temp stuff\ntmp/\n*.tmp\n*.bak\n\n# logs\n*.stackdump\n*.log\n\n# Build\nnode_modules/\n\n# Windows crap\nThumbs.db\nDesktop.ini\n\n# Mac crap\n.DS_Store\n"
  },
  {
    "path": ".jshintrc",
    "content": "{\n  \"bitwise\"   : true,\n  \"camelcase\" : true,\n  \"curly\"     : true,\n  \"eqeqeq\"    : true,\n  \"es3\"       : true,\n  \"eqnull\"    : true,\n  \"forin\"     : true,\n  \"freeze\"    : true,\n  \"immed\"     : true,\n  \"indent\"    : 2,\n  \"jquery\"    : true,\n  \"latedef\"   : true,\n  \"newcap\"    : true,\n  \"noarg\"     : true,\n  \"noempty\"   : true,\n  \"nonbsp\"    : true,\n  \"nonew\"     : true,\n  \"quotmark\"  : true,\n  \"sub\"       : true,\n  \"trailing\"  : true,\n  \"undef\"     : true,\n  \"unused\"    : true\n}"
  },
  {
    "path": ".npmrc",
    "content": "package-lock=false\n"
  },
  {
    "path": ".travis.yml",
    "content": "language: node_js\nnode_js:\n  - \"12\"\n  - \"10\"\n  - \"8\"\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# Contributing\n\nPlease do not submit pull requests to the main branch.\n\n* Fork the library.\n* Install [grunt](http://gruntjs.com/getting-started#installing-the-cli).\n* Run `npm install` to install dependencies.\n* Make your changes to the `src/format.js` file.\n* Add unit tests to the `/test/test.js` file; your contribution may not be merged without unit tests.\n* To test your changes, run `grunt`.\n* When all your tests are passing, commit your changes to your fork.\n* Submit a pull request to a branch of the repository.\n"
  },
  {
    "path": "LICENSE",
    "content": "Copyright 2016 ecava (author KPL)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell copies of the\nSoftware, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE."
  },
  {
    "path": "README.md",
    "content": "# Javascript Number Formatter\n\nLightweight & Fast JavaScript Number Formatter\n\n[![Build Status][build-image]][build-url] [![NPM Version][npm-image]][npm-url] [![devDependency Status][david-dev-image]][david-dev-url] [![MIT][license-image]][license-url]\n\n## Introduction\n\nThis standalone number formatter<sup>&dagger;</sup> is intended to be short and fast. As they are the main factors for a high performance JavaScript app. Development release is around 150 lines including license info, blank lines and comments. And production release is less than 2,000 bytes.\n\n```js\nformat( \"#,##0.####\", 1234567.890 );  // output: \"1,234,567.89\"\nformat( \"$ #,###.00\", -1234567.890 ); // output: \"$ -1,234,567.89\"\n\n// Added in v2.0.0\nformat( \"$ #,###.00\", -1234567.890, {enforceMaskSign: true});  // output: \"$ 1,234,567.89\"\nformat( \"$ -#,###.00\", -1234567.890, {enforceMaskSign: true}); // output: \"$ -1,234,567.89\"\nformat( \"$ +#,###.00\", -1234567.890, {enforceMaskSign: true}); // output: \"$ -1,234,567.89\"\nformat( \"$ +#,###.00\", 1234567.890, {enforceMaskSign: true});  // output: \"$ +1,234,567.89\"\n```\n\n&dagger; Initial development release of this code was written by KPL and hosted at [Google Code](https://code.google.com/p/javascript-number-formatter/).\n\n## Features\n\n* Short, fast, flexible yet standalone.\n* Accept standard number formatting like `#,##0.00` or with negation `-000.####`.\n* Accept any country format like `# ##0,00`, `#,###.##`, `#'###.##` or any type of non-numbering symbol.\n* Accept any numbers of digit grouping. `#,##,#0.000` or `#,###0.##` are all valid.\n* Accept any redundant/fool-proof formatting. `##,###,##.#` or `0#,#00#.###0#` are all OK.\n* Auto number rounding.\n* Simple interface, just supply mask & value like this: `format( \"0.0000\", 3.141592)`.\n* Include a prefix &amp; suffix with the mask.\n\n## Limitations\n\n* No scientific/engineering formatting.\n* Not for date or phone formation.\n* No color control.\n* <del>No prefix or suffix is allowed except leading negation symbol. So `$#,##0.00` or `#,###.##USD` will not yield expected outcome. Use `'$'+format('#,##0.00', 123.45)` or `format('#,##0.00', 456.789) + 'USD'`</del>\n* The prefix or suffix *can not* include any numbers (`0-9`), dashes (`-`), or plus signs (`+`).\n\n## Format Symbols\n\n| Description   | Symbol | Summary |\n|---------------|--------|---------|\n| Mask symbols  | #0123456789+- | Mask symbols used for formatting the value. |\n| Placeholders  | #123456789    | Un-forced digit*; this optional digit will only show if it is required as a placeholder. |\n| Zero          | 0             | Forced digit; the digit will be shown whether or not the digit is relevant to the value. |\n| Signs         | +-            | Indicates a positive or negative value; visible depending on the value sign and the `enforceMaskSign` setting. |\n| Leftmost      |               | _Any_ non-mask symbol&dagger; inside the mask will be set to represent a thousands separator. |\n| Rightmost     |               | _Any_ non-mask symbol&dagger; inside the mask&Dagger; will be set to represent the decimal separator. |\n| Prefix/Suffix |               | _Any_ non-mask symbol&dagger; outside the mask. |\n\n\\* Non-zero mask digits (`1` through `9`) behave the same as the `#`.<br>\n&dagger; Anything not a digit, and not a `+`, `-` or `#`.<br>\n&Dagger; In the case where there is a trailing decimal or comma, it will be included in the mask, e.g. `#.` or `0,`.\n\n## Note\n\nWhen only one symbol is supplied, the library will always treat that symbol as a decimal. For example, `format( '#,###', 1234567.890)` will output `1234567,890`.\n\nTo force a single symbol to be used as a separator, add a trailing symbol. In this example, a period is added to the end of the mask - `format( '#,###.', 1234567.890)` - resulting in it being used as a decimal and forcing the first symbol to be the separator and return this output: `1,234,567`.\n\n## Installation\n\n### npm package\n\n    npm install --save number-format.js\n\n## Demos\n\nA demo/sample page with few examples is provided ([demo](http://mottie.github.io/javascript-number-formatter/)).\n\nAnd a jsFiddle was created to aid in testing: https://jsfiddle.net/Mottie/t2etyodx/\n\n[build-url]: https://travis-ci.org/Mottie/javascript-number-formatter\n[build-image]: https://travis-ci.org/Mottie/javascript-number-formatter.png?branch=master\n[npm-url]: https://www.npmjs.com/package/number-format.js\n[npm-image]: https://img.shields.io/npm/v/number-format.js.svg\n[david-dev-url]: https://david-dm.org/Mottie/javascript-number-formatter?type=dev\n[david-dev-image]: https://david-dm.org/Mottie/javascript-number-formatter/dev-status.svg\n[license-url]: https://github.com/Mottie/javascript-number-formatter/blob/master/LICENSE\n[license-image]: https://img.shields.io/badge/license-MIT-blue.svg\n\n## Recent Changes\n\nView the [complete change log here](https://github.com/Mottie/javascript-number-formatter/wiki).\n\n### v2.0.7 (2018-11-13)\n\n* Update typescript binding. See [issue #20](https://github.com/Mottie/javascript-number-formatter/issues/20).\n* Fix improper placeholder behavior. Updated Readme with format symbols table. Closes [issue #19](https://github.com/Mottie/javascript-number-formatter/issues/19).\n* Add more tests.\n* Meta:\n  * Update dependencies.\n  * Improve code readability.\n  * Include version in min.js.\n\n### v2.0.6 (2018-11-06)\n\n* Trim trailing zeros in mask. Fixes [issue #18](https://github.com/Mottie/javascript-number-formatter/issues/18).\n\n### v2.0.0 &ndash; 2.0.5 (2018-10-26)\n\n* Add `ignoreSign` option (modified to `enforeceMaskSign`!).\n* Switch to XO, AVA & rollup.\n* Meta: Update dot files & remove bower support.\n* Code cleanup & convert to ES2015.\n  * Rename `ignoreSign` to `enforceMaskSign` (default `false`).\n  * Reduce code complexity.\n  * Export as node module.\n  * Update TS with options.\n  * Switch demo to use lib file & highlight valid results.\n* Switch from Grunt to rollup.\n* Switch from IIFE to UMD output.\n"
  },
  {
    "path": "index.d.ts",
    "content": "declare const format : (mask: string, value: number, options?: object) => string;\nexport = format;\n"
  },
  {
    "path": "index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>JS Number Formatter &bull; Test/Sample Page</title>\n\t<style>\n\t\tbody, table, footer, .example { margin: 0 auto; }\n\t\th2 { text-align: center; }\n\t\th3, footer, .example { margin-left: 10%; }\n\t\ttable { border-collapse: collapse; }\n\t\tth, td { border:1px solid lightgray; padding: 2px 5px; }\n\t\t.input, .format, .output { text-align: right; }\n\t\t.format, .output { white-space: pre; }\n\t\t.group { background-color: wheat }\n\t\tbody pre.prettyprint { border: 0; }\n\t\t.output:not(.valid) { background-color: rgba(160, 17, 17, 0.4); }\n\t\t.output.valid { background-color: rgba(17, 160, 17, 0.4); }\n\t</style>\n</head>\n<body>\n\t<h2><a href=\"https://github.com/Mottie/javascript-number-formatter\">JavaScript Number Formatter</a><br> Test/Sample Page</h2>\n\n\t<h3>Usage</h3>\n\t<div class=\"example\">\n\t\t<pre class=\"prettyprint lang-js\">// format( mask, value );\n// result \"1,234,567.89\"\nformat( \"#,##0.####\", 1234567.890 );</pre>\n\t</div>\n\n\t<h3>Examples</h3>\n\t<table id=\"list\" width=\"80%\">\n\t\t<tr>\n\t\t\t<th>#</th><th>Description</th><th>Input</th><th>Format</th><th>Output</th>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<td colspan=\"6\" class=\"group\">Most common world wide</td>\n\t\t</tr>\n\t\t<tr class=\"row\">\n\t\t\t<td class=\"item\"></td>\n\t\t\t<td>Simple</td>\n\t\t\t<td class=\"input\">123456.789</td>\n\t\t\t<td class=\"format\">#,##0.00</td>\n\t\t\t<td class=\"output\" data-expected=\"123,456.79\"></td>\n\t\t</tr>\n\t\t<tr class=\"row\">\n\t\t\t<td class=\"item\"></td>\n\t\t\t<td>Random</td>\n\t\t\t<td class=\"input\">20110628.15001234</td>\n\t\t\t<td class=\"format\">#,##0.###0</td>\n\t\t\t<td class=\"output\" data-expected=\"20,110,628.1500\"></td>\n\t\t</tr>\n\t\t<tr class=\"row\">\n\t\t\t<td class=\"item\"></td>\n\t\t\t<td>Random</td>\n\t\t\t<td class=\"input\">0</td>\n\t\t\t<td class=\"format\">#,###.##0</td>\n\t\t\t<td class=\"output\" data-expected=\".000\"></td>\n\t\t</tr>\n\t\t<tr class=\"row\">\n\t\t\t<td class=\"item\"></td>\n\t\t\t<td>Long number</td>\n\t\t\t<td class=\"input\">1234567890.1234567890</td>\n\t\t\t<td class=\"format\">#,###.##0</td>\n\t\t\t<td class=\"output\" data-expected=\"1,234,567,890.123\"></td>\n\t\t</tr>\n\t\t<tr class=\"row\">\n\t\t\t<td class=\"item\"></td>\n\t\t\t<td>Negative value</td>\n\t\t\t<td class=\"input\">-0.1</td>\n\t\t\t<td class=\"format\">#</td>\n\t\t\t<td class=\"output\" data-expected=\"\"></td>\n\t\t</tr>\n\t\t<tr class=\"row\">\n\t\t\t<td class=\"item\"></td>\n\t\t\t<td>Negative value</td>\n\t\t\t<td class=\"input\">-0.1</td>\n\t\t\t<td class=\"format\">0</td>\n\t\t\t<td class=\"output\" data-expected=\"0\"></td>\n\t\t</tr>\n\t\t<tr class=\"row\">\n\t\t\t<td class=\"item\"></td>\n\t\t\t<td>Negative value</td>\n\t\t\t<td class=\"input\">-0.13</td>\n\t\t\t<td class=\"format\">0.#</td>\n\t\t\t<td class=\"output\" data-expected=\"-0.1\"></td>\n\t\t</tr>\n\t\t<tr class=\"row\">\n\t\t\t<td class=\"item\"></td>\n\t\t\t<td>Negative value</td>\n\t\t\t<td class=\"input\">-5000.123456789</td>\n\t\t\t<td class=\"format\">#,##0.######</td>\n\t\t\t<td class=\"output\" data-expected=\"-5,000.123457\"></td>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<td colspan=\"6\" class=\"group\">Localization format</td>\n\t\t</tr>\n\t\t<tr class=\"row\">\n\t\t\t<td class=\"item\"></td>\n\t\t\t<td>US, UK and many more</td>\n\t\t\t<td class=\"input\">1234567.890</td>\n\t\t\t<td class=\"format\">#,##0.00</td>\n\t\t\t<td class=\"output\" data-expected=\"1,234,567.89\"></td>\n\t\t</tr>\n\t\t<tr class=\"row\">\n\t\t\t<td class=\"item\"></td>\n\t\t\t<td>Estonia, France</td>\n\t\t\t<td class=\"input\">-128983833.4560022</td>\n\t\t\t<td class=\"format\">### ###,##</td>\n\t\t\t<td class=\"output\" data-expected=\"-128 983 833,46\"></td>\n\t\t</tr>\n\t\t<tr class=\"row\">\n\t\t\t<td class=\"item\"></td>\n\t\t\t<td>Germany, Italy</td>\n\t\t\t<td class=\"input\">-1234560.10002920</td>\n\t\t\t<td class=\"format\">##.000,00</td>\n\t\t\t<td class=\"output\" data-expected=\"-1.234.560,10\"></td>\n\t\t</tr>\n\t\t<tr class=\"row\">\n\t\t\t<td class=\"item\"></td>\n\t\t\t<td>Japan</td>\n\t\t\t<td class=\"input\">963852741.001</td>\n\t\t\t<td class=\"format\">###,####.00</td>\n\t\t\t<td class=\"output\" data-expected=\"9,6385,2741.00\"></td>\n\t\t</tr>\n\t\t<tr class=\"row\">\n\t\t\t<td class=\"item\"></td>\n\t\t\t<td>Switzerland</td>\n\t\t\t<td class=\"input\">33445566.778899</td>\n\t\t\t<td class=\"format\">#'###'#00.00</td>\n\t\t\t<td class=\"output\" data-expected=\"33'445'566.78\"></td>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<td colspan=\"6\" class=\"group\">Any format</td>\n\t\t</tr>\n\t\t<tr class=\"row\">\n\t\t\t<td class=\"item\"></td>\n\t\t\t<td></td>\n\t\t\t<td class=\"input\">-1234.5678</td>\n\t\t\t<td class=\"format\">##.000,00</td>\n\t\t\t<td class=\"output\" data-expected=\"-1.234,57\"></td>\n\t\t</tr>\n\t\t<tr class=\"row\">\n\t\t\t<td class=\"item\"></td>\n\t\t\t<td></td>\n\t\t\t<td class=\"input\">4651321.841</td>\n\t\t\t<td class=\"format\">##^000*00</td>\n\t\t\t<td class=\"output\" data-expected=\"4^651^321*84\"></td>\n\t\t</tr>\n\t\t<tr class=\"row\">\n\t\t\t<td class=\"item\"></td>\n\t\t\t<td></td>\n\t\t\t<td class=\"input\">3411.498</td>\n\t\t\t<td class=\"format\">-##¿000$00</td>\n\t\t\t<td class=\"output\" data-expected=\"3¿411$50\"></td>\n\t\t</tr>\n\t\t<tr class=\"row\">\n\t\t\t<td class=\"item\"></td>\n\t\t\t<td></td>\n\t\t\t<td class=\"input\">465456456.87987212</td>\n\t\t\t<td class=\"format\">00!00@00</td>\n\t\t\t<td class=\"output\" data-expected=\"4!65!45!64!56@88\"></td>\n\t\t</tr>\n\t\t<tr class=\"row\">\n\t\t\t<td class=\"item\"></td>\n\t\t\t<td>Force comma as separator</td>\n\t\t\t<td class=\"input\">1112341.4348712</td>\n\t\t\t<td class=\"format\">###,###.</td>\n\t\t\t<td class=\"output\" data-expected=\"1,112,341\"></td>\n\t\t</tr>\n\t\t<tr class=\"row\">\n\t\t\t<td class=\"item\"></td>\n\t\t\t<td>Force space as separator</td>\n\t\t\t<td class=\"input\">2344441.4348712</td>\n\t\t\t<td class=\"format\">### ###.</td>\n\t\t\t<td class=\"output\" data-expected=\"2 344 441\"></td>\n\t\t</tr>\n\t\t<tr class=\"row\">\n\t\t\t<td class=\"item\"></td>\n\t\t\t<td>Force dot as separator</td>\n\t\t\t<td class=\"input\">2345341.4348712</td>\n\t\t\t<td class=\"format\">###.### </td>\n\t\t\t<td class=\"output\" data-expected=\"2345341.435\"></td>\n\t\t</tr>\n\n\t\t<tr>\n\t\t\t<td colspan=\"6\" class=\"group\">Prefix &amp; Suffix</td>\n\t\t</tr>\n\n\t\t<tr class=\"row\">\n\t\t\t<td class=\"item\"></td>\n\t\t\t<td>No spaces</td>\n\t\t\t<td class=\"input\">123456789.9876</td>\n\t\t\t<td class=\"format\">$#,##0.00USD</td>\n\t\t\t<td class=\"output\" data-expected=\"$123,456,789.99USD\"></td>\n\t\t</tr>\n\t\t<tr class=\"row\">\n\t\t\t<td class=\"item\"></td>\n\t\t\t<td>Extra spaces (set <code>white-space: pre;</code> in cells)</td>\n\t\t\t<td class=\"input\">123456789.9876</td>\n\t\t\t<td class=\"format\">$    #,##0.00  USD</td>\n\t\t\t<td class=\"output\" data-expected=\"$    123,456,789.99  USD\"></td>\n\t\t</tr>\n\t\t<tr class=\"row\">\n\t\t\t<td class=\"item\"></td>\n\t\t\t<td></td>\n\t\t\t<td class=\"input\">123456789.9876</td>\n\t\t\t<td class=\"format\">##.000,00 €</td>\n\t\t\t<td class=\"output\" data-expected=\"123.456.789,99 €\"></td>\n\t\t</tr>\n\t\t<tr class=\"row\">\n\t\t\t<td class=\"item\"></td>\n\t\t\t<td></td>\n\t\t\t<td class=\"input\">123456789.9876</td>\n\t\t\t<td class=\"format\">###,####.00 ¥</td>\n\t\t\t<td class=\"output\" data-expected=\"1,2345,6789.99 ¥\"></td>\n\t\t</tr>\n\t\t<tr class=\"row\">\n\t\t\t<td class=\"item\"></td>\n\t\t\t<td></td>\n\t\t\t<td class=\"input\">123456789.9876</td>\n\t\t\t<td class=\"format\">### ###,### ¢ and stuff</td>\n\t\t\t<td class=\"output\" data-expected=\"123 456 789,988 ¢ and stuff\"></td>\n\t\t</tr>\n\t\t<tr class=\"row\">\n\t\t\t<td class=\"item\"></td>\n\t\t\t<td></td>\n\t\t\t<td class=\"input\">123456789.9876</td>\n\t\t\t<td class=\"format\">  #,##0.00 a b c</td>\n\t\t\t<td class=\"output\" data-expected=\"123,456,789.99 a b c\"></td>\n\t\t</tr>\n\t\t<tr class=\"row\">\n\t\t\t<td class=\"item\"></td>\n\t\t\t<td>Spaces &amp; parenthesis (indicates a negative value, but the input is positive)</td>\n\t\t\t<td class=\"input\">123456789.9876</td>\n\t\t\t<td class=\"format\">$  (#,###.00)  Money</td>\n\t\t\t<td class=\"output\" data-expected=\"$  (123,456,789.99)  Money\"></td>\n\t\t</tr>\n\t\t<tr class=\"row\">\n\t\t\t<td class=\"item\"></td>\n\t\t\t<td>Spaces &amp; parenthesis (negative; not converted!)</td>\n\t\t\t<td class=\"input\">-123456789.9876</td>\n\t\t\t<td class=\"format\">$  (#,###.00)  Money</td>\n\t\t\t<td class=\"output\" data-expected=\"$  (123,456,789.99)  Money\"></td>\n\t\t</tr>\n\t\t<tr class=\"row\">\n\t\t\t<td class=\"item\"></td>\n\t\t\t<td>Prefix with comma</td>\n\t\t\t<td class=\"input\">123456789.9876</td>\n\t\t\t<td class=\"format\">a, b c? #.00 yep!</td>\n\t\t\t<td class=\"output\" data-expected=\"a, b c? 123456789.99 yep!\"></td>\n\t\t</tr>\n\t\t<tr class=\"row\">\n\t\t\t<td class=\"item\"></td>\n\t\t\t<td>Prefix with a periods</td>\n\t\t\t<td class=\"input\">123456789.9876</td>\n\t\t\t<td class=\"format\">cost... #,##0.00 yep!</td>\n\t\t\t<td class=\"output\" data-expected=\"cost... 123,456,789.99 yep!\"></td>\n\t\t</tr>\n\t\t<tr class=\"row\">\n\t\t\t<td class=\"item\"></td>\n\t\t\t<td>Suffix with comma &amp; period</td>\n\t\t\t<td class=\"input\">123456789.9876</td>\n\t\t\t<td class=\"format\">$# ###,00 USD, or euros.</td>\n\t\t\t<td class=\"output\" data-expected=\"$123 456 789,99 USD, or euros.\"></td>\n\t\t</tr>\n\t\t<tr class=\"row\">\n\t\t\t<td class=\"item\"></td>\n\t\t\t<td>Suffix with period</td>\n\t\t\t<td class=\"input\">123456789.9876</td>\n\t\t\t<td class=\"format\">It costs $# ###,00 euros.</td>\n\t\t\t<td class=\"output\" data-expected=\"It costs $123 456 789,99 euros.\"></td>\n\t\t</tr>\n\t\t<tr class=\"row\">\n\t\t\t<td class=\"item\"></td>\n\t\t\t<td>Hanging decimal</td>\n\t\t\t<td class=\"input\">123456789.9876</td>\n\t\t\t<td class=\"format\">test:### ###. ing</td>\n\t\t\t<td class=\"output\" data-expected=\"test:123 456 790 ing\"></td>\n\t\t</tr>\n\n\t\t<tr>\n\t\t\t<td colspan=\"6\" class=\"group\">Masks that don't work</td>\n\t\t</tr>\n\n\t\t<tr class=\"row\">\n\t\t\t<td class=\"item\"></td>\n\t\t\t<td>No \"#\" outside of mask</td>\n\t\t\t<td class=\"input\">123456789.9876</td>\n\t\t\t<td class=\"format\">item #abc $#,###.00</td>\n\t\t\t<td class=\"output\" data-expected=\"item #abc $123,456,789.99\"></td>\n\t\t</tr>\n\t\t<tr class=\"row\">\n\t\t\t<td class=\"item\"></td>\n\t\t\t<td>No numbers outside of mask</td>\n\t\t\t<td class=\"input\">123456789.9876</td>\n\t\t\t<td class=\"format\">99 items = $#,###.00</td>\n\t\t\t<td class=\"output\" data-expected=\"99 items = $123,456,789.99\"></td>\n\t\t</tr>\n\t\t<tr class=\"row\">\n\t\t\t<td class=\"item\"></td>\n\t\t\t<td>No dashes outside of mask</td>\n\t\t\t<td class=\"input\">123456789.9876</td>\n\t\t\t<td class=\"format\">cost -- $#,###.00 -- value</td>\n\t\t\t<td class=\"output\" data-expected=\"cost -- $123,456,789.99 -- value\"></td>\n\t\t</tr>\n\t\t<tr class=\"row\">\n\t\t\t<td class=\"item\"></td>\n\t\t\t<td>No plus sign in prefix</td>\n\t\t\t<td class=\"input\">123456789.9876</td>\n\t\t\t<td class=\"format\">++ value! $#,###.00</td>\n\t\t\t<td class=\"output\" data-expected=\"++ value! $123,456,789.99\"></td>\n\t\t</tr>\n\t\t<tr class=\"row\">\n\t\t\t<td class=\"item\"></td>\n\t\t\t<td>No plus sign in suffix</td>\n\t\t\t<td class=\"input\">123456789.9876</td>\n\t\t\t<td class=\"format\">$#,###.00 ++ value!</td>\n\t\t\t<td class=\"output\" data-expected=\"$123,456,789.99 ++ value!\"></td>\n\t\t</tr>\n\n\t</table>\n\t<br/>\n\n\t<hr/>\n\t<h3>See also...</h3>\n\n\t<footer>\n\t\tOriginal:\n\t\t<ul>\n\t\t\t<li><a href=\"https://code.google.com/p/javascript-number-formatter/\">javascript-number-formatter</a> repository</li>\n\t\t\t<li><del><a href=\"https://www.integraxor.com/developer/codes/js-formatter/format-sample.htm\">Demo</a></del></li>\n\t\t</ul>\n\t</footer>\n\n\t<script src=\"https://code.jquery.com/jquery-1.11.0.min.js\"></script>\n\t<script src=\"lib/format.js\"></script>\n\n\t<link href=\"https://cdnjs.cloudflare.com/ajax/libs/prettify/r298/prettify.css\" rel=\"stylesheet\"></link>\n\t<script src=\"https://cdnjs.cloudflare.com/ajax/libs/prettify/r298/run_prettify.min.js\"></script>\n\t<script>\n\t$('.row').each( function(i) {\n\t\tvar inp = $(this).find('td.input'),\n\t\t\tfmt = $(this).find('td.format'),\n\t\t\tout = $(this).find('td.output'),\n\t\t\t// Only this line is relevant to number formatting.\n\t\t\tresult = format(fmt.html().trim(), inp.html());\n\n\t\tout\n\t\t\t.toggleClass('valid', result === String(out.data('expected')))\n\t\t\t.html(result);\n\n\t\t$(this).find('.item').html( i + 1 );\n\t});\n\t</script>\n</body>\n</html>\n"
  },
  {
    "path": "lib/format.es5.js",
    "content": "/**\n * Javascript-number-formatter\n * Lightweight & Fast JavaScript Number Formatter\n *\n * @preserve IntegraXor Web SCADA - JavaScript Number Formatter (http://www.integraxor.com/)\n * @author KPL\n * @maintainer Rob Garrison\n * @copyright 2019 ecava\n * @license MIT\n * @link http://mottie.github.com/javascript-number-formatter/\n * @version 2.0.9\n */\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n  typeof define === 'function' && define.amd ? define(factory) :\n  (global = global || self, global.format = factory());\n}(this, function () { 'use strict';\n\n  function _slicedToArray(arr, i) {\n    return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest();\n  }\n\n  function _arrayWithHoles(arr) {\n    if (Array.isArray(arr)) return arr;\n  }\n\n  function _iterableToArrayLimit(arr, i) {\n    var _arr = [];\n    var _n = true;\n    var _d = false;\n    var _e = undefined;\n\n    try {\n      for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n        _arr.push(_s.value);\n\n        if (i && _arr.length === i) break;\n      }\n    } catch (err) {\n      _d = true;\n      _e = err;\n    } finally {\n      try {\n        if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n      } finally {\n        if (_d) throw _e;\n      }\n    }\n\n    return _arr;\n  }\n\n  function _nonIterableRest() {\n    throw new TypeError(\"Invalid attempt to destructure non-iterable instance\");\n  }\n\n  var maskRegex = /[0-9\\-+#]/;\n  var notMaskRegex = /[^\\d\\-+#]/g;\n\n  function getIndex(mask) {\n    return mask.search(maskRegex);\n  }\n\n  function processMask() {\n    var mask = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"#.##\";\n    var maskObj = {};\n    var len = mask.length;\n    var start = getIndex(mask);\n    maskObj.prefix = start > 0 ? mask.substring(0, start) : \"\"; // Reverse string: not an ideal method if there are surrogate pairs\n\n    var end = getIndex(mask.split(\"\").reverse().join(\"\"));\n    var offset = len - end;\n    var substr = mask.substring(offset, offset + 1); // Add 1 to offset if mask has a trailing decimal/comma\n\n    var indx = offset + (substr === \".\" || substr === \",\" ? 1 : 0);\n    maskObj.suffix = end > 0 ? mask.substring(indx, len) : \"\";\n    maskObj.mask = mask.substring(start, indx);\n    maskObj.maskHasNegativeSign = maskObj.mask.charAt(0) === \"-\";\n    maskObj.maskHasPositiveSign = maskObj.mask.charAt(0) === \"+\"; // Search for group separator & decimal; anything not digit,\n    // not +/- sign, and not #\n\n    var result = maskObj.mask.match(notMaskRegex); // Treat the right most symbol as decimal\n\n    maskObj.decimal = result && result[result.length - 1] || \".\"; // Treat the left most symbol as group separator\n\n    maskObj.separator = result && result[1] && result[0] || \",\"; // Split the decimal for the format string if any\n\n    result = maskObj.mask.split(maskObj.decimal);\n    maskObj.integer = result[0];\n    maskObj.fraction = result[1];\n    return maskObj;\n  }\n\n  function processValue(value, maskObj, options) {\n    var isNegative = false;\n    var valObj = {\n      value: value\n    };\n\n    if (value < 0) {\n      isNegative = true; // Process only abs(), and turn on flag.\n\n      valObj.value = -valObj.value;\n    }\n\n    valObj.sign = isNegative ? \"-\" : \"\"; // Fix the decimal first, toFixed will auto fill trailing zero.\n\n    valObj.value = Number(valObj.value).toFixed(maskObj.fraction && maskObj.fraction.length); // Convert number to string to trim off *all* trailing decimal zero(es)\n\n    valObj.value = Number(valObj.value).toString(); // Fill back any trailing zero according to format\n    // look for last zero in format\n\n    var posTrailZero = maskObj.fraction && maskObj.fraction.lastIndexOf(\"0\");\n\n    var _valObj$value$split = valObj.value.split(\".\"),\n        _valObj$value$split2 = _slicedToArray(_valObj$value$split, 2),\n        _valObj$value$split2$ = _valObj$value$split2[0],\n        valInteger = _valObj$value$split2$ === void 0 ? \"0\" : _valObj$value$split2$,\n        _valObj$value$split2$2 = _valObj$value$split2[1],\n        valFraction = _valObj$value$split2$2 === void 0 ? \"\" : _valObj$value$split2$2;\n\n    if (!valFraction || valFraction && valFraction.length <= posTrailZero) {\n      valFraction = posTrailZero < 0 ? \"\" : Number(\"0.\" + valFraction).toFixed(posTrailZero + 1).replace(\"0.\", \"\");\n    }\n\n    valObj.integer = valInteger;\n    valObj.fraction = valFraction;\n    addSeparators(valObj, maskObj); // Remove negative sign if result is zero\n\n    if (valObj.result === \"0\" || valObj.result === \"\") {\n      // Remove negative sign if result is zero\n      isNegative = false;\n      valObj.sign = \"\";\n    }\n\n    if (!isNegative && maskObj.maskHasPositiveSign) {\n      valObj.sign = \"+\";\n    } else if (isNegative && maskObj.maskHasPositiveSign) {\n      valObj.sign = \"-\";\n    } else if (isNegative) {\n      valObj.sign = options && options.enforceMaskSign && !maskObj.maskHasNegativeSign ? \"\" : \"-\";\n    }\n\n    return valObj;\n  }\n\n  function addSeparators(valObj, maskObj) {\n    valObj.result = \"\"; // Look for separator\n\n    var szSep = maskObj.integer.split(maskObj.separator); // Join back without separator for counting the pos of any leading 0\n\n    var maskInteger = szSep.join(\"\");\n    var posLeadZero = maskInteger && maskInteger.indexOf(\"0\");\n\n    if (posLeadZero > -1) {\n      while (valObj.integer.length < maskInteger.length - posLeadZero) {\n        valObj.integer = \"0\" + valObj.integer;\n      }\n    } else if (Number(valObj.integer) === 0) {\n      valObj.integer = \"\";\n    } // Process the first group separator from decimal (.) only, the rest ignore.\n    // get the length of the last slice of split result.\n\n\n    var posSeparator = szSep[1] && szSep[szSep.length - 1].length;\n\n    if (posSeparator) {\n      var len = valObj.integer.length;\n      var offset = len % posSeparator;\n\n      for (var indx = 0; indx < len; indx++) {\n        valObj.result += valObj.integer.charAt(indx); // -posSeparator so that won't trail separator on full length\n\n        if (!((indx - offset + 1) % posSeparator) && indx < len - posSeparator) {\n          valObj.result += maskObj.separator;\n        }\n      }\n    } else {\n      valObj.result = valObj.integer;\n    }\n\n    valObj.result += maskObj.fraction && valObj.fraction ? maskObj.decimal + valObj.fraction : \"\";\n    return valObj;\n  }\n\n  var format = (function (mask, value) {\n    var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n    if (!mask || isNaN(Number(value))) {\n      // Invalid inputs\n      return value;\n    }\n\n    var maskObj = processMask(mask);\n    var valObj = processValue(value, maskObj, options);\n    return maskObj.prefix + valObj.sign + valObj.result + maskObj.suffix;\n  });\n\n  return format;\n\n}));\n"
  },
  {
    "path": "lib/format.esm.js",
    "content": "/**\n * Javascript-number-formatter\n * Lightweight & Fast JavaScript Number Formatter\n *\n * @preserve IntegraXor Web SCADA - JavaScript Number Formatter (http://www.integraxor.com/)\n * @author KPL\n * @maintainer Rob Garrison\n * @copyright 2019 ecava\n * @license MIT\n * @link http://mottie.github.com/javascript-number-formatter/\n * @version 2.0.9\n */\nconst maskRegex = /[0-9\\-+#]/;\nconst notMaskRegex = /[^\\d\\-+#]/g;\n\nfunction getIndex(mask) {\n\treturn mask.search(maskRegex);\n}\n\nfunction processMask(mask = \"#.##\") {\n\tconst maskObj = {};\n\tconst len = mask.length;\n\tconst start = getIndex(mask);\n\tmaskObj.prefix = start > 0 ? mask.substring(0, start) : \"\";\n\n\t// Reverse string: not an ideal method if there are surrogate pairs\n\tconst end = getIndex(mask.split(\"\").reverse().join(\"\"));\n\tconst offset = len - end;\n\tconst substr = mask.substring(offset, offset + 1);\n\t// Add 1 to offset if mask has a trailing decimal/comma\n\tconst indx = offset + ((substr === \".\" || (substr === \",\")) ? 1 : 0);\n\tmaskObj.suffix = end > 0 ? mask.substring(indx, len) : \"\";\n\n\tmaskObj.mask = mask.substring(start, indx);\n\tmaskObj.maskHasNegativeSign = maskObj.mask.charAt(0) === \"-\";\n\tmaskObj.maskHasPositiveSign = maskObj.mask.charAt(0) === \"+\";\n\n\t// Search for group separator & decimal; anything not digit,\n\t// not +/- sign, and not #\n\tlet result = maskObj.mask.match(notMaskRegex);\n\t// Treat the right most symbol as decimal\n\tmaskObj.decimal = (result && result[result.length - 1]) || \".\";\n\t// Treat the left most symbol as group separator\n\tmaskObj.separator = (result && result[1] && result[0]) || \",\";\n\n\t// Split the decimal for the format string if any\n\tresult = maskObj.mask.split(maskObj.decimal);\n\tmaskObj.integer = result[0];\n\tmaskObj.fraction = result[1];\n\treturn maskObj;\n}\n\nfunction processValue(value, maskObj, options) {\n\tlet isNegative = false;\n\tconst valObj = {\n\t\tvalue\n\t};\n\tif (value < 0) {\n\t\tisNegative = true;\n\t\t// Process only abs(), and turn on flag.\n\t\tvalObj.value = -valObj.value;\n\t}\n\n\tvalObj.sign = isNegative ? \"-\" : \"\";\n\n\t// Fix the decimal first, toFixed will auto fill trailing zero.\n\tvalObj.value = Number(valObj.value).toFixed(maskObj.fraction && maskObj.fraction.length);\n\t// Convert number to string to trim off *all* trailing decimal zero(es)\n\tvalObj.value = Number(valObj.value).toString();\n\n\t// Fill back any trailing zero according to format\n\t// look for last zero in format\n\tconst posTrailZero = maskObj.fraction && maskObj.fraction.lastIndexOf(\"0\");\n\tlet [valInteger = \"0\", valFraction = \"\"] = valObj.value.split(\".\");\n\tif (!valFraction || (valFraction && valFraction.length <= posTrailZero)) {\n\t\tvalFraction = posTrailZero < 0\n\t\t\t? \"\"\n\t\t\t: (Number(\"0.\" + valFraction).toFixed(posTrailZero + 1)).replace(\"0.\", \"\");\n\t}\n\n\tvalObj.integer = valInteger;\n\tvalObj.fraction = valFraction;\n\taddSeparators(valObj, maskObj);\n\n\t// Remove negative sign if result is zero\n\tif (valObj.result === \"0\" || valObj.result === \"\") {\n\t\t// Remove negative sign if result is zero\n\t\tisNegative = false;\n\t\tvalObj.sign = \"\";\n\t}\n\n\tif (!isNegative && maskObj.maskHasPositiveSign) {\n\t\tvalObj.sign = \"+\";\n\t} else if (isNegative && maskObj.maskHasPositiveSign) {\n\t\tvalObj.sign = \"-\";\n\t} else if (isNegative) {\n\t\tvalObj.sign = options && options.enforceMaskSign && !maskObj.maskHasNegativeSign\n\t\t\t? \"\"\n\t\t\t: \"-\";\n\t}\n\n\treturn valObj;\n}\n\nfunction addSeparators(valObj, maskObj) {\n\tvalObj.result = \"\";\n\t// Look for separator\n\tconst szSep = maskObj.integer.split(maskObj.separator);\n\t// Join back without separator for counting the pos of any leading 0\n\tconst maskInteger = szSep.join(\"\");\n\n\tconst posLeadZero = maskInteger && maskInteger.indexOf(\"0\");\n\tif (posLeadZero > -1) {\n\t\twhile (valObj.integer.length < (maskInteger.length - posLeadZero)) {\n\t\t\tvalObj.integer = \"0\" + valObj.integer;\n\t\t}\n\t} else if (Number(valObj.integer) === 0) {\n\t\tvalObj.integer = \"\";\n\t}\n\n\t// Process the first group separator from decimal (.) only, the rest ignore.\n\t// get the length of the last slice of split result.\n\tconst posSeparator = (szSep[1] && szSep[szSep.length - 1].length);\n\tif (posSeparator) {\n\t\tconst len = valObj.integer.length;\n\t\tconst offset = len % posSeparator;\n\t\tfor (let indx = 0; indx < len; indx++) {\n\t\t\tvalObj.result += valObj.integer.charAt(indx);\n\t\t\t// -posSeparator so that won't trail separator on full length\n\t\t\tif (!((indx - offset + 1) % posSeparator) && indx < len - posSeparator) {\n\t\t\t\tvalObj.result += maskObj.separator;\n\t\t\t}\n\t\t}\n\t} else {\n\t\tvalObj.result = valObj.integer;\n\t}\n\n\tvalObj.result += (maskObj.fraction && valObj.fraction)\n\t\t? maskObj.decimal + valObj.fraction\n\t\t: \"\";\n\treturn valObj;\n}\n\nvar format = (mask, value, options = {}) => {\n\tif (!mask || isNaN(Number(value))) {\n\t\t// Invalid inputs\n\t\treturn value;\n\t}\n\n\tconst maskObj = processMask(mask);\n\tconst valObj = processValue(value, maskObj, options);\n\treturn maskObj.prefix + valObj.sign + valObj.result + maskObj.suffix;\n};\n\nexport default format;\n"
  },
  {
    "path": "lib/format.js",
    "content": "/**\n * Javascript-number-formatter\n * Lightweight & Fast JavaScript Number Formatter\n *\n * @preserve IntegraXor Web SCADA - JavaScript Number Formatter (http://www.integraxor.com/)\n * @author KPL\n * @maintainer Rob Garrison\n * @copyright 2019 ecava\n * @license MIT\n * @link http://mottie.github.com/javascript-number-formatter/\n * @version 2.0.9\n */\n(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n\ttypeof define === 'function' && define.amd ? define(factory) :\n\t(global = global || self, global.format = factory());\n}(this, function () { 'use strict';\n\n\tconst maskRegex = /[0-9\\-+#]/;\n\tconst notMaskRegex = /[^\\d\\-+#]/g;\n\n\tfunction getIndex(mask) {\n\t\treturn mask.search(maskRegex);\n\t}\n\n\tfunction processMask(mask = \"#.##\") {\n\t\tconst maskObj = {};\n\t\tconst len = mask.length;\n\t\tconst start = getIndex(mask);\n\t\tmaskObj.prefix = start > 0 ? mask.substring(0, start) : \"\";\n\n\t\t// Reverse string: not an ideal method if there are surrogate pairs\n\t\tconst end = getIndex(mask.split(\"\").reverse().join(\"\"));\n\t\tconst offset = len - end;\n\t\tconst substr = mask.substring(offset, offset + 1);\n\t\t// Add 1 to offset if mask has a trailing decimal/comma\n\t\tconst indx = offset + ((substr === \".\" || (substr === \",\")) ? 1 : 0);\n\t\tmaskObj.suffix = end > 0 ? mask.substring(indx, len) : \"\";\n\n\t\tmaskObj.mask = mask.substring(start, indx);\n\t\tmaskObj.maskHasNegativeSign = maskObj.mask.charAt(0) === \"-\";\n\t\tmaskObj.maskHasPositiveSign = maskObj.mask.charAt(0) === \"+\";\n\n\t\t// Search for group separator & decimal; anything not digit,\n\t\t// not +/- sign, and not #\n\t\tlet result = maskObj.mask.match(notMaskRegex);\n\t\t// Treat the right most symbol as decimal\n\t\tmaskObj.decimal = (result && result[result.length - 1]) || \".\";\n\t\t// Treat the left most symbol as group separator\n\t\tmaskObj.separator = (result && result[1] && result[0]) || \",\";\n\n\t\t// Split the decimal for the format string if any\n\t\tresult = maskObj.mask.split(maskObj.decimal);\n\t\tmaskObj.integer = result[0];\n\t\tmaskObj.fraction = result[1];\n\t\treturn maskObj;\n\t}\n\n\tfunction processValue(value, maskObj, options) {\n\t\tlet isNegative = false;\n\t\tconst valObj = {\n\t\t\tvalue\n\t\t};\n\t\tif (value < 0) {\n\t\t\tisNegative = true;\n\t\t\t// Process only abs(), and turn on flag.\n\t\t\tvalObj.value = -valObj.value;\n\t\t}\n\n\t\tvalObj.sign = isNegative ? \"-\" : \"\";\n\n\t\t// Fix the decimal first, toFixed will auto fill trailing zero.\n\t\tvalObj.value = Number(valObj.value).toFixed(maskObj.fraction && maskObj.fraction.length);\n\t\t// Convert number to string to trim off *all* trailing decimal zero(es)\n\t\tvalObj.value = Number(valObj.value).toString();\n\n\t\t// Fill back any trailing zero according to format\n\t\t// look for last zero in format\n\t\tconst posTrailZero = maskObj.fraction && maskObj.fraction.lastIndexOf(\"0\");\n\t\tlet [valInteger = \"0\", valFraction = \"\"] = valObj.value.split(\".\");\n\t\tif (!valFraction || (valFraction && valFraction.length <= posTrailZero)) {\n\t\t\tvalFraction = posTrailZero < 0\n\t\t\t\t? \"\"\n\t\t\t\t: (Number(\"0.\" + valFraction).toFixed(posTrailZero + 1)).replace(\"0.\", \"\");\n\t\t}\n\n\t\tvalObj.integer = valInteger;\n\t\tvalObj.fraction = valFraction;\n\t\taddSeparators(valObj, maskObj);\n\n\t\t// Remove negative sign if result is zero\n\t\tif (valObj.result === \"0\" || valObj.result === \"\") {\n\t\t\t// Remove negative sign if result is zero\n\t\t\tisNegative = false;\n\t\t\tvalObj.sign = \"\";\n\t\t}\n\n\t\tif (!isNegative && maskObj.maskHasPositiveSign) {\n\t\t\tvalObj.sign = \"+\";\n\t\t} else if (isNegative && maskObj.maskHasPositiveSign) {\n\t\t\tvalObj.sign = \"-\";\n\t\t} else if (isNegative) {\n\t\t\tvalObj.sign = options && options.enforceMaskSign && !maskObj.maskHasNegativeSign\n\t\t\t\t? \"\"\n\t\t\t\t: \"-\";\n\t\t}\n\n\t\treturn valObj;\n\t}\n\n\tfunction addSeparators(valObj, maskObj) {\n\t\tvalObj.result = \"\";\n\t\t// Look for separator\n\t\tconst szSep = maskObj.integer.split(maskObj.separator);\n\t\t// Join back without separator for counting the pos of any leading 0\n\t\tconst maskInteger = szSep.join(\"\");\n\n\t\tconst posLeadZero = maskInteger && maskInteger.indexOf(\"0\");\n\t\tif (posLeadZero > -1) {\n\t\t\twhile (valObj.integer.length < (maskInteger.length - posLeadZero)) {\n\t\t\t\tvalObj.integer = \"0\" + valObj.integer;\n\t\t\t}\n\t\t} else if (Number(valObj.integer) === 0) {\n\t\t\tvalObj.integer = \"\";\n\t\t}\n\n\t\t// Process the first group separator from decimal (.) only, the rest ignore.\n\t\t// get the length of the last slice of split result.\n\t\tconst posSeparator = (szSep[1] && szSep[szSep.length - 1].length);\n\t\tif (posSeparator) {\n\t\t\tconst len = valObj.integer.length;\n\t\t\tconst offset = len % posSeparator;\n\t\t\tfor (let indx = 0; indx < len; indx++) {\n\t\t\t\tvalObj.result += valObj.integer.charAt(indx);\n\t\t\t\t// -posSeparator so that won't trail separator on full length\n\t\t\t\tif (!((indx - offset + 1) % posSeparator) && indx < len - posSeparator) {\n\t\t\t\t\tvalObj.result += maskObj.separator;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tvalObj.result = valObj.integer;\n\t\t}\n\n\t\tvalObj.result += (maskObj.fraction && valObj.fraction)\n\t\t\t? maskObj.decimal + valObj.fraction\n\t\t\t: \"\";\n\t\treturn valObj;\n\t}\n\n\tvar format = (mask, value, options = {}) => {\n\t\tif (!mask || isNaN(Number(value))) {\n\t\t\t// Invalid inputs\n\t\t\treturn value;\n\t\t}\n\n\t\tconst maskObj = processMask(mask);\n\t\tconst valObj = processValue(value, maskObj, options);\n\t\treturn maskObj.prefix + valObj.sign + valObj.result + maskObj.suffix;\n\t};\n\n\treturn format;\n\n}));\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"number-format.js\",\n  \"nick\": \"javascript-number-formatter\",\n  \"description\": \"Lightweight & Fast JavaScript Number Formatter\",\n  \"version\": \"2.0.9\",\n  \"homepage\": \"http://mottie.github.com/javascript-number-formatter/\",\n  \"main\": \"lib/format.min.js\",\n  \"demo\": \"https://github.com/Mottie/javascript-number-formatter/index.html\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git://github.com/Mottie/javascript-number-formatter.git\"\n  },\n  \"author\": {\n    \"name\": \"KPL\",\n    \"url\": \"https://code.google.com/u/100789773228459308870/\"\n  },\n  \"maintainers\": [\n    {\n      \"name\": \"Rob Garrison\",\n      \"url\": \"https://github.com/Mottie\",\n      \"email\": \"wowmotty@gmail.com\"\n    }\n  ],\n  \"license\": \"MIT\",\n  \"bugs\": \"https://github.com/Mottie/javascript-number-formatter/issues\",\n  \"docs\": \"http://mottie.github.com/javascript-number-formatter/index.html\",\n  \"keywords\": [\n    \"number\",\n    \"format\",\n    \"formatter\",\n    \"currency\"\n  ],\n  \"files\": [\n    \"lib/\",\n    \"index.d.ts\"\n  ],\n  \"xo\": {\n    \"space\": false,\n    \"ignore\": [\n      \"rollup.config.js\",\n      \"lib\"\n    ],\n    \"envs\": [\n      \"node\"\n    ],\n    \"rules\": {\n      \"no-sparse-arrays\": 0,\n      \"quotes\": [\n        \"error\",\n        \"double\"\n      ],\n      \"operator-linebreak\": 0\n    }\n  },\n  \"engines\": {\n    \"node\": \">=8\"\n  },\n  \"scripts\": {\n    \"build\": \"rollup -c\",\n    \"test\": \"xo && ava\",\n    \"updater\": \"npx updates -cu && npm install\"\n  },\n  \"typings\": \"./index.d.ts\",\n  \"devDependencies\": {\n    \"@babel/core\": \"^7.2.2\",\n    \"@babel/plugin-transform-object-assign\": \"^7.2.0\",\n    \"@babel/preset-env\": \"^7.3.1\",\n    \"ava\": \"*\",\n    \"rollup\": \"^1.1.2\",\n    \"rollup-plugin-babel\": \"^4.3.2\",\n    \"rollup-plugin-cjs-es\": \"^0.7.0\",\n    \"rollup-plugin-node-resolve\": \"^4.0.0\",\n    \"rollup-plugin-terser\": \"^4.0.3\",\n    \"updates\": \"^6.2.1\",\n    \"xo\": \"*\"\n  }\n}\n"
  },
  {
    "path": "rollup.config.js",
    "content": "import cjs from \"rollup-plugin-cjs-es\";\nimport resolve from \"rollup-plugin-node-resolve\";\nimport babel from \"rollup-plugin-babel\";\nimport {terser} from \"rollup-plugin-terser\";\n\nimport pkg from \"./package.json\";\n\nconst banner = `/**\n * Javascript-number-formatter\n * Lightweight & Fast JavaScript Number Formatter\n *\n * @preserve IntegraXor Web SCADA - JavaScript Number Formatter (http://www.integraxor.com/)\n * @author KPL\n * @maintainer Rob Garrison\n * @copyright ${new Date().getFullYear()} ecava\n * @license MIT\n * @link http://mottie.github.com/javascript-number-formatter/\n * @version ${pkg.version}\n */`;\n\nexport default [{\n\tinput: \"src/format.js\",\n\toutput: [{\n\t\tfile: \"lib/format.js\",\n\t\tname: \"format\",\n\t\tformat: \"umd\",\n\t\tsourceMap: false,\n\t\tbanner,\n\t},{\n\t\tfile: \"lib/format.esm.js\",\n\t\tname: \"format\",\n\t\tformat: \"esm\",\n\t\tsourceMap: false,\n\t\tbanner,\n\t}],\n\tplugins: [\n\t\tresolve(),\n\t\tcjs({\n\t\t\tnested: true\n\t\t})\n\t]\n}, {\n\tinput: \"src/format.js\",\n\toutput: [{\n\t\tfile: \"lib/format.es5.js\",\n\t\tname: \"format\",\n\t\tformat: \"umd\",\n\t\tsourceMap: false,\n\t\tbanner,\n\t}],\n\tplugins: [\n\t\tresolve(),\n\t\tcjs({\n\t\t\tnested: true\n\t\t}),\n\t\tbabel({\n\t\t\texclude: \"node_modules/**\",\n\t\t\tpresets: [\n\t\t\t\t[\"@babel/preset-env\", {\n\t\t\t\t\tmodules: false\n\t\t\t\t}]\n\t\t\t],\n\t\t\tplugins: [\n\t\t\t\t\"@babel/plugin-transform-object-assign\"\n\t\t\t]\n\t\t}),\n\t]\n},\n\n{\n\tinput: \"src/format.js\",\n\toutput: {\n\t\tfile: \"lib/format.min.js\",\n\t\tname: \"format\",\n\t\tformat: \"umd\",\n\t\tsourceMap: false,\n\t\tbanner: `/*! Javascript-number-formatter v${pkg.version} */`,\n\t},\n\tplugins: [\n\t\tresolve(),\n\t\tcjs({\n\t\t\tnested: true\n\t\t}),\n\t\tterser({\n\t\t\tcompress: {\n\t\t\t\tpasses: 3\n\t\t\t},\n\t\t\toutput: {\n\t\t\t\tcomments: /^!/\n\t\t\t}\n\t\t})\n\t]\n}];\n"
  },
  {
    "path": "src/format.js",
    "content": "\"use strict\";\n\nconst maskRegex = /[0-9\\-+#]/;\nconst notMaskRegex = /[^\\d\\-+#]/g;\n\nfunction getIndex(mask) {\n\treturn mask.search(maskRegex);\n}\n\nfunction processMask(mask = \"#.##\") {\n\tconst maskObj = {};\n\tconst len = mask.length;\n\tconst start = getIndex(mask);\n\tmaskObj.prefix = start > 0 ? mask.substring(0, start) : \"\";\n\n\t// Reverse string: not an ideal method if there are surrogate pairs\n\tconst end = getIndex(mask.split(\"\").reverse().join(\"\"));\n\tconst offset = len - end;\n\tconst substr = mask.substring(offset, offset + 1);\n\t// Add 1 to offset if mask has a trailing decimal/comma\n\tconst indx = offset + ((substr === \".\" || (substr === \",\")) ? 1 : 0);\n\tmaskObj.suffix = end > 0 ? mask.substring(indx, len) : \"\";\n\n\tmaskObj.mask = mask.substring(start, indx);\n\tmaskObj.maskHasNegativeSign = maskObj.mask.charAt(0) === \"-\";\n\tmaskObj.maskHasPositiveSign = maskObj.mask.charAt(0) === \"+\";\n\n\t// Search for group separator & decimal; anything not digit,\n\t// not +/- sign, and not #\n\tlet result = maskObj.mask.match(notMaskRegex);\n\t// Treat the right most symbol as decimal\n\tmaskObj.decimal = (result && result[result.length - 1]) || \".\";\n\t// Treat the left most symbol as group separator\n\tmaskObj.separator = (result && result[1] && result[0]) || \",\";\n\n\t// Split the decimal for the format string if any\n\tresult = maskObj.mask.split(maskObj.decimal);\n\tmaskObj.integer = result[0];\n\tmaskObj.fraction = result[1];\n\treturn maskObj;\n}\n\nfunction processValue(value, maskObj, options) {\n\tlet isNegative = false;\n\tconst valObj = {\n\t\tvalue\n\t};\n\tif (value < 0) {\n\t\tisNegative = true;\n\t\t// Process only abs(), and turn on flag.\n\t\tvalObj.value = -valObj.value;\n\t}\n\n\tvalObj.sign = isNegative ? \"-\" : \"\";\n\n\t// Fix the decimal first, toFixed will auto fill trailing zero.\n\tvalObj.value = Number(valObj.value).toFixed(maskObj.fraction && maskObj.fraction.length);\n\t// Convert number to string to trim off *all* trailing decimal zero(es)\n\tvalObj.value = Number(valObj.value).toString();\n\n\t// Fill back any trailing zero according to format\n\t// look for last zero in format\n\tconst posTrailZero = maskObj.fraction && maskObj.fraction.lastIndexOf(\"0\");\n\tlet [valInteger = \"0\", valFraction = \"\"] = valObj.value.split(\".\");\n\tif (!valFraction || (valFraction && valFraction.length <= posTrailZero)) {\n\t\tvalFraction = posTrailZero < 0\n\t\t\t? \"\"\n\t\t\t: (Number(\"0.\" + valFraction).toFixed(posTrailZero + 1)).replace(\"0.\", \"\");\n\t}\n\n\tvalObj.integer = valInteger;\n\tvalObj.fraction = valFraction;\n\taddSeparators(valObj, maskObj);\n\n\t// Remove negative sign if result is zero\n\tif (valObj.result === \"0\" || valObj.result === \"\") {\n\t\t// Remove negative sign if result is zero\n\t\tisNegative = false;\n\t\tvalObj.sign = \"\";\n\t}\n\n\tif (!isNegative && maskObj.maskHasPositiveSign) {\n\t\tvalObj.sign = \"+\";\n\t} else if (isNegative && maskObj.maskHasPositiveSign) {\n\t\tvalObj.sign = \"-\";\n\t} else if (isNegative) {\n\t\tvalObj.sign = options && options.enforceMaskSign && !maskObj.maskHasNegativeSign\n\t\t\t? \"\"\n\t\t\t: \"-\";\n\t}\n\n\treturn valObj;\n}\n\nfunction addSeparators(valObj, maskObj) {\n\tvalObj.result = \"\";\n\t// Look for separator\n\tconst szSep = maskObj.integer.split(maskObj.separator);\n\t// Join back without separator for counting the pos of any leading 0\n\tconst maskInteger = szSep.join(\"\");\n\n\tconst posLeadZero = maskInteger && maskInteger.indexOf(\"0\");\n\tif (posLeadZero > -1) {\n\t\twhile (valObj.integer.length < (maskInteger.length - posLeadZero)) {\n\t\t\tvalObj.integer = \"0\" + valObj.integer;\n\t\t}\n\t} else if (Number(valObj.integer) === 0) {\n\t\tvalObj.integer = \"\";\n\t}\n\n\t// Process the first group separator from decimal (.) only, the rest ignore.\n\t// get the length of the last slice of split result.\n\tconst posSeparator = (szSep[1] && szSep[szSep.length - 1].length);\n\tif (posSeparator) {\n\t\tconst len = valObj.integer.length;\n\t\tconst offset = len % posSeparator;\n\t\tfor (let indx = 0; indx < len; indx++) {\n\t\t\tvalObj.result += valObj.integer.charAt(indx);\n\t\t\t// -posSeparator so that won't trail separator on full length\n\t\t\tif (!((indx - offset + 1) % posSeparator) && indx < len - posSeparator) {\n\t\t\t\tvalObj.result += maskObj.separator;\n\t\t\t}\n\t\t}\n\t} else {\n\t\tvalObj.result = valObj.integer;\n\t}\n\n\tvalObj.result += (maskObj.fraction && valObj.fraction)\n\t\t? maskObj.decimal + valObj.fraction\n\t\t: \"\";\n\treturn valObj;\n}\n\nmodule.exports = (mask, value, options = {}) => {\n\tif (!mask || isNaN(Number(value))) {\n\t\t// Invalid inputs\n\t\treturn value;\n\t}\n\n\tconst maskObj = processMask(mask);\n\tconst valObj = processValue(value, maskObj, options);\n\treturn maskObj.prefix + valObj.sign + valObj.result + maskObj.suffix;\n};\n"
  },
  {
    "path": "test/test.js",
    "content": "import test from \"ava\";\nimport format from \"../src/format\";\n\n/* Simple mask */\ntest(\"basic masks\", t => {\n\tt.is(format(\"#,##0.00\", 123456789.123), \"123,456,789.12\", \"Mask: \\\"#,##0.00\\\"\");\n\tt.is(format(\"#,##0.00\", \"123456.789\"), \"123,456.79\");\n\tt.is(format(\"#,##0.00\", 123456.789), \"123,456.79\");\n\tt.is(format(\"#,##0.00\", 123456.7), \"123,456.70\");\n\tt.is(format(\"#,##0.00\", 123456), \"123,456.00\");\n\tt.is(format(\"#,##0.00\", 0), \"0.00\");\n\tt.is(format(\"#\", -0.1), \"\");\n\tt.is(format(\"0\", -0.1), \"0\");\n\tt.is(format(\"0.#\", -0.13), \"-0.1\");\n\tt.is(format(\"#,##0.00\", -123), \"-123.00\");\n\tt.is(format(\"#,##0.00\", -123456.789), \"-123,456.79\");\n\n\tt.is(format(\"#,##0.0\", 123456789.123), \"123,456,789.1\", \"Mask: \\\"#,##0.0\\\"\");\n\tt.is(format(\"#,##0.0\", 123456.789), \"123,456.8\");\n\tt.is(format(\"#,##0.0\", 123456.7), \"123,456.7\");\n\tt.is(format(\"#,##0.0\", 123456), \"123,456.0\");\n\tt.is(format(\"#,##0.0\", 0), \"0.0\");\n\tt.is(format(\"#,##0.0\", -123), \"-123.0\");\n\tt.is(format(\"#,##0.0\", -123456.789), \"-123,456.8\");\n\n\tt.is(format(\"#,##0.\", 123456789.123), \"123,456,789\", \"Mask: \\\"#,##0.\\\"\");\n\tt.is(format(\"#,##0.\", 123456.789), \"123,457\");\n\tt.is(format(\"#,##0.\", 123456.7), \"123,457\");\n\tt.is(format(\"#,##0.\", 123456), \"123,456\");\n\tt.is(format(\"#,##0.\", 0), \"0\");\n\tt.is(format(\"#,##0.\", -123), \"-123\");\n\tt.is(format(\"#,##0.\", -123456.789), \"-123,457\");\n\n\tt.is(format(\"#.##0,\", 123456789.123), \"123.456.789\", \"Mask: \\\"#.##0,\\\"\");\n\tt.is(format(\"#.##0,\", 123456.789), \"123.457\");\n\tt.is(format(\"#.##0,\", 123456.7), \"123.457\");\n\tt.is(format(\"#.##0,\", 123456), \"123.456\");\n\tt.is(format(\"#.##0,\", 0), \"0\");\n\tt.is(format(\"#.##0,\", -123), \"-123\");\n\tt.is(format(\"#.##0,\", -123456.789), \"-123.457\");\n\n\tt.is(format(\"#,##0.###0\", 12345678.98765432), \"12,345,678.9877\", \"Mask: \\\"#,##0.###0\\\"\");\n});\n\n/* Localizations */\ntest(\"Localizations\", t => {\n\tt.is(format(\"### ###,##\", 123456789.987654321), \"123 456 789,99\", \"Estonia, France: ### ###,##\");\n\tt.is(format(\"##.000,00\", 123456789.987654321), \"123.456.789,99\", \"Germany, Italy: ##.000,00\");\n\tt.is(format(\"###,####.00\", 123456789.987654321), \"1,2345,6789.99\", \"Japan: ###,####.00\");\n\tt.is(format(\"#'###'#00.00\", 123456789.987654321), \"123'456'789.99\", \"Switzerland: #'###'#00.00\");\n});\n\n/* Made-up-izations */\ntest(\"Any format\", t => {\n\tt.is(format(\"#,##0 00\", 123456789.987654321), \"123,456,789 99\");\n\tt.is(format(\"#x##0 00\", 123456789.987654321), \"123x456x789 99\");\n\tt.is(format(\"##^000*00\", 123456789.987654321), \"123^456^789*99\");\n\tt.is(format(\"##¿000$00\", 123456789.987654321), \"123¿456¿789$99\");\n\tt.is(format(\"00!00@00\", 123456789.987654321), \"1!23!45!67!89@99\");\n});\n\n/* Any non-zero digit in mask behaves like # */\ntest(\"Non-zero digits\", t => {\n\tt.is(format(\"999.999\", 123.0), \"123\");\n\tt.is(format(\"123,456789\", 123.0), \"123\");\n});\n\n/* Precision */\ntest(\"Precision\", t => {\n\tt.is(format(\"### ###,\", 123456789.987654321), \"123 456 790\");\n\tt.is(format(\"###.###,\", 123456789.987654321), \"123.456.790\");\n\tt.is(format(\"##,000.\", 123456789.987654321), \"123,456,790\");\n\tt.is(format(\"###,####.\", 123456789.187654321), \"1,2345,6789\");\n\tt.is(format(\"#'###'#00,\", 123456789.087654321), \"123'456'789\");\n\tt.is(format(\"#,##0.####\", 1234567.890), \"1,234,567.89\");\n\tt.is(format(\"#,##0.###0\", 1234567.890), \"1,234,567.8900\");\n\tt.is(format(\"#,##0.##0#\", 1234567.890), \"1,234,567.890\");\n\tt.is(format(\"#,##0.#0##\", 1234567.890), \"1,234,567.89\");\n\tt.is(format(\"#,##0.#\", 1234567.890), \"1,234,567.9\");\n\tt.is(format(\"#,###.\", 1234567.890), \"1,234,568\");\n\n\tt.is(format(\"#,###.\", 1234567), \"1,234,567\");\n\tt.is(format(\"#,###.#\", 1234567), \"1,234,567\");\n\tt.is(format(\"#,###.##\", 1234567), \"1,234,567\");\n\tt.is(format(\"#,###.0\", 1234567), \"1,234,567.0\");\n\tt.is(format(\"#,###.00\", 1234567), \"1,234,567.00\");\n\n\tt.is(format(\"#.00\", 0.78), \".78\");\n\tt.is(format(\"#.000\", 0.78), \".780\");\n\tt.is(format(\"#.0000\", 0.78), \".7800\");\n\tt.is(format(\"0.00\", 0.78), \"0.78\");\n\tt.is(format(\"0.000\", 0.78), \"0.780\");\n\tt.is(format(\"0.0000\", 0.78), \"0.7800\");\n\tt.is(format(\"00.00\", 0.78), \"00.78\");\n\n\tt.is(format(\"#.##\", 0), \"\");\n\tt.is(format(\"0.00\", 0), \"0.00\");\n\tt.is(format(\"0\", 0), \"0\");\n});\n\n/* Mask with prefix and/or suffix */\ntest(\"Prefix & Suffix\", t => {\n\t// Usage\n\tt.is(format(\"$#,##0.00USD\", 123456789.123), \"$123,456,789.12USD\", \"$#,##0.00USD\");\n\tt.is(format(\"$ #,##0.00 USD\", 123456789.123), \"$ 123,456,789.12 USD\", \"$ #,##0.00 USD\");\n\tt.is(format(\"##.000,00 €\", 123456789.123), \"123.456.789,12 €\", \"##.000,00 €\");\n\tt.is(format(\"###,####.00 ¥\", 123456789.123), \"1,2345,6789.12 ¥\", \"###,####.00 ¥\");\n\n\tt.is(format(\"### ###,### ¢ and stuff\", 123456789.123), \"123 456 789,123 ¢ and stuff\", \"### ###,### ¢ and stuff\");\n\tt.is(format(\"  #,##0.00 a b c \", 123456789.123), \"  123,456,789.12 a b c \", \"leading & trailing spaces\");\n\n\tt.is(format(\"$  (#,###.00)  Money\", 123456789.123), \"$  (123,456,789.12)  Money\", \"spaces & mask wrapped in parenthesis\");\n\tt.is(format(\"prefix with a comma, includes everything? #.00 yep!\", 123456789.123), \"prefix with a comma, includes everything? 123456789.12 yep!\", \"prefix with a comma\");\n\tt.is(format(\"$# ###,00 USD, or euros.\", 123456789.123), \"$123 456 789,12 USD, or euros.\", \"suffix with comma & period\");\n\tt.is(format(\"prefix with a periods?... #.00 yep!\", 123456789.123), \"prefix with a periods?... 123456789.12 yep!\", \"prefix with a periods\");\n\tt.is(format(\"It costs $# ###,00 euros.\", 123456789.123), \"It costs $123 456 789,12 euros.\", \"suffix with period\");\n\tt.is(format(\"test:### ###. ing\", 123456789.123), \"test:123 456 789 ing\", \"Hanging decimals\");\n});\n\ntest(\"Masks that don't work\", t => {\n\t// Not allowed\n\tt.is(format(\"No # outside of the mask $#,###.00\", 123456789.123) !== \"No # outside of the mask $123,456,789.12\", true, \"BROKEN: # outside of the mask\");\n\tt.is(format(\"99 items = $#,###.00\", 123456789.123) !== \"99 items = $123,456,789.12\", true, \"BROKEN: numbers outside of mask\");\n\tt.is(format(\"cost -- $#,###.00 -- value\", 123456789.123) !== \"cost -- $123,456,789.12 -- value\", true, \"BROKEN: dashes outside of mask\");\n\tt.is(format(\"++ value! $#,###.00 ++ value!\", 123456789.123) !== \"++ value! $123,456,789.12 ++ value!\", true, \"BROKEN: plus signs outside of mask\");\n});\n\ntest(\"Numbers with negative sign\", t => {\n\tt.is(format(\"-#,##0.######\", -5000.123456789), \"-5,000.123457\");\n\tt.is(format(\"-#,##0.######\", 5000.123456789), \"5,000.123457\");\n\tt.is(format(\"#,##0.######\", -5000.123456789), \"-5,000.123457\");\n\tt.is(format(\"$ #,###.00\", -1234567.890), \"$ -1,234,567.89\");\n\tt.is(format(\"$ -#,###.00\", -1234567.890), \"$ -1,234,567.89\");\n\n\tt.is(format(\"-#,##0.######\", -5000.123456789, {enforceMaskSign: true}), \"-5,000.123457\");\n\tt.is(format(\"-#,##0.######\", 5000.123456789, {enforceMaskSign: true}), \"5,000.123457\");\n\tt.is(format(\"#,##0.######\", -5000.123456789, {enforceMaskSign: true}), \"5,000.123457\");\n\tt.is(format(\"$ #,###.00\", -1234567.890, {enforceMaskSign: true}), \"$ 1,234,567.89\");\n\tt.is(format(\"$ -#,###.00\", -1234567.890, {enforceMaskSign: true}), \"$ -1,234,567.89\");\n});\n\ntest(\"Numbers with positive sign\", t => {\n\tt.is(format(\"+#,##0.######\", +5000.123456789), \"+5,000.123457\");\n\tt.is(format(\"+#,##0.######\", 5000.123456789), \"+5,000.123457\");\n\tt.is(format(\"#,##0.######\", +5000.123456789), \"5,000.123457\");\n\tt.is(format(\"+#,##0.######\", -5000.123456789), \"-5,000.123457\");\n\n\tt.is(format(\"+#,##0.######\", +5000.123456789, {enforceMaskSign: true}), \"+5,000.123457\");\n\tt.is(format(\"+#,##0.######\", 5000.123456789, {enforceMaskSign: true}), \"+5,000.123457\");\n\tt.is(format(\"#,##0.######\", +5000.123456789, {enforceMaskSign: true}), \"5,000.123457\");\n\tt.is(format(\"+#,##0.######\", -5000.123456789, {enforceMaskSign: true}), \"-5,000.123457\");\n\tt.is(format(\"$ +#,###.00\", -1234567.890, {enforceMaskSign: true}), \"$ -1,234,567.89\");\n\tt.is(format(\"$ +#,###.00\", 1234567.890, {enforceMaskSign: true}), \"$ +1,234,567.89\");\n});\n"
  }
]