forked from sheetjs/sheetjs
pulling ssf into main project [ci skip]
This commit is contained in:
commit
b738e5d3f1
1
packages/ssf-cli/.gitignore
vendored
Normal file
1
packages/ssf-cli/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
node_modules/
|
1
packages/ssf-cli/.npmignore
Normal file
1
packages/ssf-cli/.npmignore
Normal file
@ -0,0 +1 @@
|
||||
*.tgz
|
48
packages/ssf-cli/README.md
Normal file
48
packages/ssf-cli/README.md
Normal file
@ -0,0 +1,48 @@
|
||||
# [SSF Command-Line Interface](http://sheetjs.com)
|
||||
|
||||
ssf (SpreadSheet Format) is a pure JS library to format data using ECMA-376
|
||||
spreadsheet format codes (used in popular spreadsheet software packages).
|
||||
|
||||
This CLI tool formats numbers from shell scripts and other command-line tools.
|
||||
|
||||
## Installation
|
||||
|
||||
With [npm](https://www.npmjs.org/package/ssf-cli):
|
||||
|
||||
```bash
|
||||
$ npm install -g ssf-cli
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
`ssf-cli` takes two arguments: the format string and the value to be formatted.
|
||||
|
||||
The value is formatted twice, once interpreting the value as a string and once
|
||||
interpreting the value as a number, and both results are printed to standard
|
||||
output, with a pipe character `|` after each value:
|
||||
|
||||
```bash
|
||||
$ bin/ssf.njs "#,##0.00" 12345
|
||||
12345|12,345.00|
|
||||
$ bin/ssf.njs "0;0;0;:@:" 12345
|
||||
:12345:|12345|
|
||||
```
|
||||
|
||||
Extracting the values in a pipeline is straightforward with AWK:
|
||||
|
||||
```bash
|
||||
$ bin/ssf.njs "#,##0.00" 12345 | awk -F\| '{print $2}'
|
||||
12,345.00
|
||||
```
|
||||
|
||||
## License
|
||||
|
||||
Please consult the attached LICENSE file for details. All rights not explicitly
|
||||
granted by the Apache 2.0 license are reserved by the Original Author.
|
||||
|
||||
## Credits
|
||||
|
||||
Special thanks to [Garrett Luu](https://garrettluu.com/) for spinning off the
|
||||
command from the SSF module.
|
||||
|
||||
[![Analytics](https://ga-beacon.appspot.com/UA-36810333-1/SheetJS/ssf?pixel)](https://github.com/SheetJS/ssf)
|
8
packages/ssf-cli/bin/ssf.njs
Executable file
8
packages/ssf-cli/bin/ssf.njs
Executable file
@ -0,0 +1,8 @@
|
||||
#!/usr/bin/env node
|
||||
/* ssf.js (C) 2013-present SheetJS -- http://sheetjs.com */
|
||||
/* eslint-env node */
|
||||
/* eslint no-console:0 */
|
||||
/*jshint node:true */
|
||||
var cli = require('../');
|
||||
|
||||
cli();
|
16
packages/ssf-cli/index.js
Normal file
16
packages/ssf-cli/index.js
Normal file
@ -0,0 +1,16 @@
|
||||
/* ssf.js (C) 2013-present SheetJS -- http://sheetjs.com */
|
||||
/* eslint-env node */
|
||||
/* eslint no-console:0 */
|
||||
/*jshint node:true */
|
||||
var X = require('ssf');
|
||||
function run() {
|
||||
var argv = process.argv.slice(2);
|
||||
if (argv.length < 2 || argv[0] == "-h" || argv[0] == "--help") {
|
||||
console.error("usage: ssf-cli <format> <value>");
|
||||
console.error("output: format_as_string|format_as_number|");
|
||||
process.exit(0);
|
||||
}
|
||||
console.log(X.format(argv[0], argv[1]) + "|" + X.format(argv[0], +(argv[1])) + "|");
|
||||
}
|
||||
|
||||
module.exports = run;
|
31
packages/ssf-cli/package.json
Normal file
31
packages/ssf-cli/package.json
Normal file
@ -0,0 +1,31 @@
|
||||
{
|
||||
"name": "ssf-cli",
|
||||
"version": "1.1.0",
|
||||
"author": "sheetjs",
|
||||
"description": "Command-line interface for ssf",
|
||||
"keywords": [
|
||||
"format",
|
||||
"sprintf",
|
||||
"spreadsheet"
|
||||
],
|
||||
"main": "index.js",
|
||||
"bin": {
|
||||
"ssf-cli": "bin/ssf.njs"
|
||||
},
|
||||
"dependencies": {
|
||||
"ssf": "^0.11.2"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git://github.com/SheetJS/sheetjs.git",
|
||||
"directory": "packages/ssf-cli"
|
||||
},
|
||||
"homepage": "http://sheetjs.com/",
|
||||
"bugs": {
|
||||
"url": "https://github.com/SheetJS/sheetjs/issues"
|
||||
},
|
||||
"license": "Apache-2.0",
|
||||
"engines": {
|
||||
"node": ">=0.8"
|
||||
}
|
||||
}
|
24
packages/ssf/.eslintrc
Normal file
24
packages/ssf/.eslintrc
Normal file
@ -0,0 +1,24 @@
|
||||
{
|
||||
"env": { "shared-node-browser":true },
|
||||
"globals": {},
|
||||
"parserOptions": {
|
||||
"ecmaVersion": 3
|
||||
},
|
||||
"plugins": [ "html", "json" ],
|
||||
"extends": "eslint:recommended",
|
||||
"rules": {
|
||||
"comma-style": [ 2, "last" ],
|
||||
"comma-dangle": [ 2, "never" ],
|
||||
"curly": 0,
|
||||
"no-bitwise": 0,
|
||||
"no-console": 0,
|
||||
"no-control-regex": 0,
|
||||
"no-empty": 0,
|
||||
"no-trailing-spaces": 2,
|
||||
"no-use-before-define": [ 1, {
|
||||
"functions":false, "classes":true, "variables":false
|
||||
}],
|
||||
"no-useless-escape": 0,
|
||||
"semi": [ 2, "always" ]
|
||||
}
|
||||
}
|
31
packages/ssf/.flowconfig
Normal file
31
packages/ssf/.flowconfig
Normal file
@ -0,0 +1,31 @@
|
||||
[ignore]
|
||||
.*/node_modules/.*
|
||||
.*/dist/.*
|
||||
.*/test/bits/.*
|
||||
.*/test/.*
|
||||
.*/ssf.js
|
||||
.*/ssf_lc.js
|
||||
|
||||
.*/bits/.*
|
||||
.*/ctest/.*
|
||||
.*/misc/.*
|
||||
.*/perf/.*
|
||||
.*/tmp/.*
|
||||
.*/tmp/.*
|
||||
|
||||
.*/demo/browser.js
|
||||
.*/shim.js
|
||||
|
||||
[include]
|
||||
ssf.flow.js
|
||||
.*/bin/.*.njs
|
||||
|
||||
[libs]
|
||||
misc/flow.js
|
||||
misc/flowdeps.js
|
||||
|
||||
[options]
|
||||
module.file_ext=.js
|
||||
module.file_ext=.njs
|
||||
module.ignore_non_literal_requires=true
|
||||
suppress_comment= \\(.\\|\n\\)*\\$FlowIgnore
|
28
packages/ssf/.gitignore
vendored
Normal file
28
packages/ssf/.gitignore
vendored
Normal file
@ -0,0 +1,28 @@
|
||||
node_modules
|
||||
misc/coverage.html
|
||||
.vocrc
|
||||
v8.log
|
||||
tmp
|
||||
*.tgz
|
||||
*.[tT][xX][tT]
|
||||
*.[cC][sS][vV]
|
||||
*.[dD][iIbB][fF]
|
||||
*.[pP][rR][nN]
|
||||
*.[sS][lL][kK]
|
||||
*.socialcalc
|
||||
*.[xX][lL][sSwWcC]
|
||||
*.[xX][lL][sS][xXmMbB]
|
||||
*.[oO][dD][sS]
|
||||
*.[fF][oO][dD][sS]
|
||||
*.[xX][mM][lL]
|
||||
*.[uU][oO][sS]
|
||||
*.[wW][kKqQbB][S1234567890]
|
||||
*.[qQ][pP][wW]
|
||||
*.123
|
||||
*.htm
|
||||
*.html
|
||||
*.sheetjs
|
||||
*.exe
|
||||
perf.log
|
||||
ctest/test.js
|
||||
ctest/sauce*
|
6
packages/ssf/.jscs.json
Normal file
6
packages/ssf/.jscs.json
Normal file
@ -0,0 +1,6 @@
|
||||
{
|
||||
"requireCommaBeforeLineBreak": true,
|
||||
"disallowTrailingWhitespace": true,
|
||||
"disallowTrailingComma": true
|
||||
}
|
||||
|
51
packages/ssf/.npmignore
Normal file
51
packages/ssf/.npmignore
Normal file
@ -0,0 +1,51 @@
|
||||
test/
|
||||
ctest/
|
||||
index.html
|
||||
misc/
|
||||
packages/
|
||||
node_modules
|
||||
*.tgz
|
||||
_book
|
||||
book.json
|
||||
tmp
|
||||
mocha.js
|
||||
*.[tT][xX][tT]
|
||||
*.[cC][sS][vV]
|
||||
*.[dD][iIbB][fF]
|
||||
*.[pP][rR][nN]
|
||||
*.[sS][lL][kK]
|
||||
*.socialcalc
|
||||
*.[xX][lL][sSwWcCaAtTmM]
|
||||
*.[xX][lL][sSaAtT][xXmMbB]
|
||||
*.[oO][dD][sS]
|
||||
*.[fF][oO][dD][sS]
|
||||
*.[xX][mM][lL]
|
||||
*.[uU][oO][sS]
|
||||
*.[wW][kKqQbB][S1234567890]
|
||||
*.[qQ][pP][wW]
|
||||
*.[bB][iI][fF][fF][23458]
|
||||
*.[rR][tT][fF]
|
||||
*.[eE][tT][hH]
|
||||
*.123
|
||||
*.htm
|
||||
*.html
|
||||
*.sheetjs
|
||||
*.exe
|
||||
*.img
|
||||
.gitignore
|
||||
.gitattributes
|
||||
.fossaignore
|
||||
.spelling
|
||||
.eslintrc
|
||||
.jshintrc
|
||||
Makefile
|
||||
.npmignore
|
||||
.jscs.json
|
||||
.gitmodules
|
||||
.travis.yml
|
||||
.flowconfig
|
||||
bits/
|
||||
.vocrc
|
||||
v8.log
|
||||
perf.log
|
||||
ssf.md
|
9
packages/ssf/.spelling
Normal file
9
packages/ssf/.spelling
Normal file
@ -0,0 +1,9 @@
|
||||
# ssf.js (C) 2013-present SheetJS -- http://sheetjs.com
|
||||
SheetJS
|
||||
ssf
|
||||
|
||||
ECMA-376
|
||||
xls
|
||||
xlsb
|
||||
|
||||
npm
|
45
packages/ssf/.travis.yml
Normal file
45
packages/ssf/.travis.yml
Normal file
@ -0,0 +1,45 @@
|
||||
language: node_js
|
||||
dist: xenial
|
||||
node_js:
|
||||
- "14"
|
||||
- "13"
|
||||
- "12"
|
||||
- "11"
|
||||
- "10"
|
||||
- "9"
|
||||
- "8"
|
||||
- "7"
|
||||
- "6"
|
||||
- "5"
|
||||
- "4"
|
||||
- "0.12"
|
||||
- "0.10"
|
||||
- "0.8"
|
||||
matrix:
|
||||
include:
|
||||
- node_js: "14"
|
||||
env: TZ="America/New_York"
|
||||
- node_js: "12"
|
||||
env: TZ="America/Los_Angeles"
|
||||
- node_js: "10"
|
||||
env: TZ="Europe/London"
|
||||
- node_js: "8"
|
||||
env: TZ="Europe/Berlin"
|
||||
- node_js: "6"
|
||||
env: TZ="Asia/Kolkata"
|
||||
- node_js: "4"
|
||||
env: TZ="Asia/Shanghai"
|
||||
- node_js: "0.12"
|
||||
env: TZ="Asia/Seoul"
|
||||
|
||||
before_install:
|
||||
- "npm config set strict-ssl false"
|
||||
- "./misc/node_version.sh"
|
||||
- "npm install -g mocha@2.x voc"
|
||||
- "npm install blanket"
|
||||
- "npm install word"
|
||||
- "npm install coveralls mocha-lcov-reporter"
|
||||
install:
|
||||
- npm install
|
||||
after_success:
|
||||
- "make coveralls"
|
201
packages/ssf/LICENSE
Normal file
201
packages/ssf/LICENSE
Normal file
@ -0,0 +1,201 @@
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "{}"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright (C) 2013-present SheetJS LLC
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
124
packages/ssf/Makefile
Executable file
124
packages/ssf/Makefile
Executable file
@ -0,0 +1,124 @@
|
||||
SHELL=/bin/bash
|
||||
LIB=ssf
|
||||
REQS=
|
||||
ADDONS=
|
||||
AUXTARGETS=
|
||||
CMDS=bin/ssf.njs
|
||||
HTMLLINT=index.html
|
||||
|
||||
ULIB=$(shell echo $(LIB) | tr a-z A-Z)
|
||||
DEPS=$(sort $(wildcard bits/*.js))
|
||||
TARGET=$(LIB).js
|
||||
FLOWTARGET=$(LIB).flow.js
|
||||
FLOWAUX=$(patsubst %.js,%.flow.js,$(AUXTARGETS))
|
||||
AUXSCPTS=
|
||||
FLOWTGTS=$(TARGET) $(AUXTARGETS) $(AUXSCPTS)
|
||||
UGLIFYOPTS=--support-ie8
|
||||
CLOSURE=/usr/local/lib/node_modules/google-closure-compiler/compiler.jar
|
||||
|
||||
## Main Targets
|
||||
|
||||
.PHONY: all
|
||||
all: $(TARGET) $(AUXTARGETS) $(AUXSCPTS) ## Build library and auxiliary scripts
|
||||
|
||||
$(FLOWTGTS): %.js : %.flow.js
|
||||
node -e 'process.stdout.write(require("fs").readFileSync("$<","utf8").replace(/^[ \t]*\/\*[:#][^*]*\*\/\s*(\n)?/gm,"").replace(/\/\*[:#][^*]*\*\//gm,""))' > $@
|
||||
|
||||
$(FLOWTARGET): $(DEPS)
|
||||
cat $^ | tr -d '\15\32' > $@
|
||||
|
||||
bits/01_version.js: package.json
|
||||
echo "$(ULIB).version = '"`grep version package.json | awk '{gsub(/[^0-9a-z\.-]/,"",$$2); print $$2}'`"';" > $@
|
||||
|
||||
.PHONY: clean
|
||||
clean: ## Remove targets and build artifacts
|
||||
rm -f $(TARGET) $(FLOWTARGET)
|
||||
|
||||
.PHONY: git
|
||||
git: ## show version string
|
||||
@echo "$$(node -pe 'require("./package.json").version') (ssf)"
|
||||
|
||||
|
||||
## Testing
|
||||
|
||||
.PHONY: test mocha
|
||||
test mocha: ## Run test suite
|
||||
mocha -R spec -t 30000
|
||||
|
||||
.PHONY: test_misc
|
||||
test_misc:
|
||||
MINTEST=1 mocha -R spec -t 30000
|
||||
|
||||
.PHONY: travis
|
||||
travis: ## Run test suite with minimal output
|
||||
mocha -R dot -t 30000
|
||||
|
||||
.PHONY: ctest
|
||||
ctest: ## Build browser test fixtures
|
||||
browserify -t brfs test/{comma,dateNF,dates,exp,fraction,general,implied,oddities,utilities,valid}.js > ctest/test.js
|
||||
|
||||
.PHONY: ctestserv
|
||||
ctestserv: ## Start a test server on port 8000
|
||||
@cd ctest && python -mSimpleHTTPServer
|
||||
|
||||
|
||||
## Code Checking
|
||||
|
||||
.PHONY: fullint
|
||||
fullint: lint old-lint tslint flow mdlint ## Run all checks
|
||||
|
||||
.PHONY: lint
|
||||
lint: $(TARGET) $(AUXTARGETS) ## Run eslint checks
|
||||
@eslint --ext .js,.njs,.json,.html,.htm $(TARGET) $(AUXTARGETS) $(CMDS) $(HTMLLINT) package.json
|
||||
if [ -e $(CLOSURE) ]; then java -jar $(CLOSURE) $(REQS) $(FLOWTARGET) --jscomp_warning=reportUnknownTypes >/dev/null; fi
|
||||
|
||||
.PHONY: old-lint
|
||||
old-lint: $(TARGET) $(AUXTARGETS) ## Run jshint and jscs checks
|
||||
@jshint --show-non-errors $(TARGET) $(AUXTARGETS)
|
||||
@jshint --show-non-errors $(CMDS)
|
||||
@jshint --show-non-errors package.json test/
|
||||
@jshint --show-non-errors --extract=always $(HTMLLINT)
|
||||
@jscs $(TARGET) $(AUXTARGETS) test/*.js
|
||||
if [ -e $(CLOSURE) ]; then java -jar $(CLOSURE) $(REQS) $(FLOWTARGET) --jscomp_warning=reportUnknownTypes >/dev/null; fi
|
||||
|
||||
.PHONY: tslint
|
||||
tslint: $(TARGET) ## Run typescript checks
|
||||
#@npm install dtslint typescript
|
||||
#@npm run-script dtslint
|
||||
dtslint types
|
||||
|
||||
.PHONY: flow
|
||||
flow: lint ## Run flow checker
|
||||
@flow check --all --show-all-errors
|
||||
|
||||
.PHONY: cov
|
||||
cov: misc/coverage.html ## Run coverage test
|
||||
|
||||
.PHONY: cov_min
|
||||
cov_min:
|
||||
MINTEST=1 make cov
|
||||
|
||||
misc/coverage.html: $(TARGET)
|
||||
mocha --require blanket -R html-cov -t 20000 > $@
|
||||
|
||||
.PHONY: full_coveralls
|
||||
full_coveralls:
|
||||
mocha --require blanket --reporter mocha-lcov-reporter | ./node_modules/coveralls/bin/coveralls.js
|
||||
|
||||
.PHONY: coveralls
|
||||
coveralls: ## Coverage Test + Send to coveralls.io
|
||||
MINTEST=1 make full_coveralls
|
||||
|
||||
MDLINT=README.md
|
||||
.PHONY: mdlint
|
||||
mdlint: $(MDLINT) ## Check markdown documents
|
||||
alex $^
|
||||
mdspell -a -n -x -r --en-us $^
|
||||
|
||||
.PHONY: help
|
||||
help:
|
||||
@grep -hE '(^[a-zA-Z_-][ a-zA-Z_-]*:.*?|^#[#*])' $(MAKEFILE_LIST) | bash misc/help.sh
|
||||
|
||||
#* To show a spinner, append "-spin" to any target e.g. cov-spin
|
||||
%-spin:
|
||||
@make $* & bash misc/spin.sh $$!
|
119
packages/ssf/README.md
Normal file
119
packages/ssf/README.md
Normal file
@ -0,0 +1,119 @@
|
||||
# [SheetJS SSF](http://sheetjs.com)
|
||||
|
||||
ssf (SpreadSheet Format) is a pure JS library to format data using ECMA-376
|
||||
spreadsheet format codes (used in popular spreadsheet software packages).
|
||||
|
||||
This is the community version. We also offer a pro version with additional
|
||||
features like international support as well as dedicated support.
|
||||
|
||||
## Installation
|
||||
|
||||
With [npm](https://www.npmjs.org/package/ssf):
|
||||
|
||||
```bash
|
||||
$ npm install ssf
|
||||
```
|
||||
|
||||
In the browser:
|
||||
|
||||
```html
|
||||
<script src="ssf.js"></script>
|
||||
```
|
||||
|
||||
The browser exposes a variable `SSF`
|
||||
|
||||
When installed globally, npm installs a script `ssf` that renders the format
|
||||
string with the given arguments. Running the script with `-h` displays help.
|
||||
|
||||
The script will manipulate `module.exports` if available . This is not always
|
||||
desirable. To prevent the behavior, define `DO_NOT_EXPORT_SSF`.
|
||||
|
||||
## Usage
|
||||
|
||||
`SSF.format(fmt, val, opts)` formats `val` using the format `fmt`.
|
||||
|
||||
If `fmt` is a string, it will be parsed and evaluated. If `fmt` is a `number`,
|
||||
the actual format will be the corresponding entry in the internal format table.
|
||||
For a raw numeric format like `000`, the value should be passed as a string.
|
||||
|
||||
Date arguments are interpreted in the local time of the JS client.
|
||||
|
||||
The options argument may contain the following keys:
|
||||
|
||||
| Option Name | Default | Description |
|
||||
| :---------- | :-----: | :--------------------------------------------------- |
|
||||
| `date1904` | false | Use 1904 date system if true, 1900 system if false |
|
||||
|
||||
### Manipulating the Internal Format Table
|
||||
|
||||
Binary spreadsheet formats store cell formats in a table and reference by index.
|
||||
This library uses a global table:
|
||||
|
||||
`SSF._table` is the underlying object, mapping numeric keys to format strings.
|
||||
|
||||
`SSF.load(fmt:string, idx:?number):number` assigns the format to the specified
|
||||
index and returns the index. If the index is not specified, SSF will search the
|
||||
space for an available format slot pick an unused slot. For compatibility with
|
||||
the XLS and XLSB file formats, custom indices should be in the valid ranges
|
||||
`5-8`, `23-26`, `41-44`, `63-66`, `164-382` (see `[MS-XLSB] 2.4.655 BrtFmt`)
|
||||
|
||||
`SSF.get_table()` gets the internal format table (number to format mapping).
|
||||
|
||||
`SSF.load_table(table)` sets the internal format table.
|
||||
|
||||
### Other Utilities
|
||||
|
||||
`SSF.parse_date_code(val:number, opts:?any)` parses `val`, returning an object:
|
||||
|
||||
```typescript
|
||||
type SSFDate = {
|
||||
D:number; /* number of whole days since relevant epoch, 0 <= D */
|
||||
y:number; /* integral year portion, epoch_year <= y */
|
||||
m:number; /* integral month portion, 1 <= m <= 12 */
|
||||
d:number; /* integral day portion, subject to gregorian YMD constraints */
|
||||
q:number; /* integral day of week (0=Sunday .. 6=Saturday) 0 <= q <= 6 */
|
||||
|
||||
T:number; /* number of seconds since midnight, 0 <= T < 86400 */
|
||||
H:number; /* integral number of hours since midnight, 0 <= H < 24 */
|
||||
M:number; /* integral number of minutes since the last hour, 0 <= M < 60 */
|
||||
S:number; /* integral number of seconds since the last minute, 0 <= S < 60 */
|
||||
u:number; /* sub-second part of time, 0 <= u < 1 */
|
||||
}
|
||||
```
|
||||
|
||||
`SSF.is_date(fmt:string):boolean` returns `true` if `fmt` encodes a date format.
|
||||
|
||||
## Examples
|
||||
|
||||
- [Basic Demo](http://oss.sheetjs.com/ssf/)
|
||||
- [Custom Formats Builder](https://customformats.com)
|
||||
|
||||
## Related Packages
|
||||
|
||||
[`ssf-cli`](https://www.npmjs.com/package/ssf-cli) is a simple NodeJS command
|
||||
line tool for formatting numbers.
|
||||
|
||||
## License
|
||||
|
||||
Please consult the attached LICENSE file for details. All rights not explicitly
|
||||
granted by the Apache 2.0 license are reserved by the Original Author.
|
||||
|
||||
## References
|
||||
|
||||
- `ECMA-376`: Office Open XML File Formats
|
||||
- `MS-XLS`: Excel Binary File Format (.xls) Structure Specification
|
||||
- `MS-XLSB`: Excel (.xlsb) Binary File Format
|
||||
|
||||
## Badges
|
||||
|
||||
[![Sauce Test Status](https://saucelabs.com/browser-matrix/ssfjs.svg)](https://saucelabs.com/u/ssfjs)
|
||||
|
||||
[![Build Status](https://travis-ci.org/SheetJS/ssf.svg?branch=master)](https://travis-ci.org/SheetJS/ssf)
|
||||
|
||||
[![Coverage Status](http://img.shields.io/coveralls/SheetJS/ssf/master.svg)](https://coveralls.io/r/SheetJS/ssf?branch=master)
|
||||
|
||||
[![NPM Downloads](https://img.shields.io/npm/dt/ssf.svg)](https://npmjs.org/package/ssf)
|
||||
|
||||
[![Dependencies Status](https://david-dm.org/sheetjs/ssf/status.svg)](https://david-dm.org/sheetjs/ssf)
|
||||
|
||||
[![Analytics](https://ga-beacon.appspot.com/UA-36810333-1/SheetJS/ssf?pixel)](https://github.com/SheetJS/ssf)
|
6
packages/ssf/bits/00_header.js
Normal file
6
packages/ssf/bits/00_header.js
Normal file
@ -0,0 +1,6 @@
|
||||
/* ssf.js (C) 2013-present SheetJS -- http://sheetjs.com */
|
||||
/* vim: set ts=2: */
|
||||
/*jshint -W041 */
|
||||
/*:: declare var DO_NOT_EXPORT_SSF: any; */
|
||||
var SSF/*:SSFModule*/ = ({}/*:any*/);
|
||||
var make_ssf = function make_ssf(SSF/*:SSFModule*/){
|
1
packages/ssf/bits/01_version.js
Normal file
1
packages/ssf/bits/01_version.js
Normal file
@ -0,0 +1 @@
|
||||
SSF.version = '0.11.2';
|
10
packages/ssf/bits/02_utilities.js
Normal file
10
packages/ssf/bits/02_utilities.js
Normal file
@ -0,0 +1,10 @@
|
||||
function _strrev(x/*:string*/)/*:string*/ { var o = "", i = x.length-1; while(i>=0) o += x.charAt(i--); return o; }
|
||||
function fill(c/*:string*/,l/*:number*/)/*:string*/ { var o = ""; while(o.length < l) o+=c; return o; }
|
||||
function pad0(v/*:any*/,d/*:number*/)/*:string*/{var t=""+v; return t.length>=d?t:fill('0',d-t.length)+t;}
|
||||
function pad_(v/*:any*/,d/*:number*/)/*:string*/{var t=""+v;return t.length>=d?t:fill(' ',d-t.length)+t;}
|
||||
function rpad_(v/*:any*/,d/*:number*/)/*:string*/{var t=""+v; return t.length>=d?t:t+fill(' ',d-t.length);}
|
||||
function pad0r1(v/*:any*/,d/*:number*/)/*:string*/{var t=""+Math.round(v); return t.length>=d?t:fill('0',d-t.length)+t;}
|
||||
function pad0r2(v/*:any*/,d/*:number*/)/*:string*/{var t=""+v; return t.length>=d?t:fill('0',d-t.length)+t;}
|
||||
var p2_32 = Math.pow(2,32);
|
||||
function pad0r(v/*:any*/,d/*:number*/)/*:string*/{if(v>p2_32||v<-p2_32) return pad0r1(v,d); var i = Math.round(v); return pad0r2(i,d); }
|
||||
function isgeneral(s/*:string*/, i/*:?number*/)/*:boolean*/ { i = i || 0; return s.length >= 7 + i && (s.charCodeAt(i)|32) === 103 && (s.charCodeAt(i+1)|32) === 101 && (s.charCodeAt(i+2)|32) === 110 && (s.charCodeAt(i+3)|32) === 101 && (s.charCodeAt(i+4)|32) === 114 && (s.charCodeAt(i+5)|32) === 97 && (s.charCodeAt(i+6)|32) === 108; }
|
3
packages/ssf/bits/10_types.js
Normal file
3
packages/ssf/bits/10_types.js
Normal file
@ -0,0 +1,3 @@
|
||||
/*::
|
||||
type SSF_write_num = {(type:string, fmt:string, val:number):string};
|
||||
*/
|
23
packages/ssf/bits/20_consts.js
Normal file
23
packages/ssf/bits/20_consts.js
Normal file
@ -0,0 +1,23 @@
|
||||
var days/*:Array<Array<string> >*/ = [
|
||||
['Sun', 'Sunday'],
|
||||
['Mon', 'Monday'],
|
||||
['Tue', 'Tuesday'],
|
||||
['Wed', 'Wednesday'],
|
||||
['Thu', 'Thursday'],
|
||||
['Fri', 'Friday'],
|
||||
['Sat', 'Saturday']
|
||||
];
|
||||
var months/*:Array<Array<string> >*/ = [
|
||||
['J', 'Jan', 'January'],
|
||||
['F', 'Feb', 'February'],
|
||||
['M', 'Mar', 'March'],
|
||||
['A', 'Apr', 'April'],
|
||||
['M', 'May', 'May'],
|
||||
['J', 'Jun', 'June'],
|
||||
['J', 'Jul', 'July'],
|
||||
['A', 'Aug', 'August'],
|
||||
['S', 'Sep', 'September'],
|
||||
['O', 'Oct', 'October'],
|
||||
['N', 'Nov', 'November'],
|
||||
['D', 'Dec', 'December']
|
||||
];
|
34
packages/ssf/bits/25_table.js
Normal file
34
packages/ssf/bits/25_table.js
Normal file
@ -0,0 +1,34 @@
|
||||
function init_table(t/*:any*/) {
|
||||
t[0]= 'General';
|
||||
t[1]= '0';
|
||||
t[2]= '0.00';
|
||||
t[3]= '#,##0';
|
||||
t[4]= '#,##0.00';
|
||||
t[9]= '0%';
|
||||
t[10]= '0.00%';
|
||||
t[11]= '0.00E+00';
|
||||
t[12]= '# ?/?';
|
||||
t[13]= '# ??/??';
|
||||
t[14]= 'm/d/yy';
|
||||
t[15]= 'd-mmm-yy';
|
||||
t[16]= 'd-mmm';
|
||||
t[17]= 'mmm-yy';
|
||||
t[18]= 'h:mm AM/PM';
|
||||
t[19]= 'h:mm:ss AM/PM';
|
||||
t[20]= 'h:mm';
|
||||
t[21]= 'h:mm:ss';
|
||||
t[22]= 'm/d/yy h:mm';
|
||||
t[37]= '#,##0 ;(#,##0)';
|
||||
t[38]= '#,##0 ;[Red](#,##0)';
|
||||
t[39]= '#,##0.00;(#,##0.00)';
|
||||
t[40]= '#,##0.00;[Red](#,##0.00)';
|
||||
t[45]= 'mm:ss';
|
||||
t[46]= '[h]:mm:ss';
|
||||
t[47]= 'mmss.0';
|
||||
t[48]= '##0.0E+0';
|
||||
t[49]= '@';
|
||||
t[56]= '"上午/下午 "hh"時"mm"分"ss"秒 "';
|
||||
}
|
||||
|
||||
var table_fmt = {};
|
||||
init_table(table_fmt);
|
55
packages/ssf/bits/26_defaults.js
Normal file
55
packages/ssf/bits/26_defaults.js
Normal file
@ -0,0 +1,55 @@
|
||||
/* Defaults determined by systematically testing in Excel 2019 */
|
||||
|
||||
/* These formats appear to default to other formats in the table */
|
||||
var default_map/*:Array<number>*/ = [];
|
||||
var defi = 0;
|
||||
|
||||
// 5 -> 37 ... 8 -> 40
|
||||
for(defi = 5; defi <= 8; ++defi) default_map[defi] = 32 + defi;
|
||||
|
||||
// 23 -> 0 ... 26 -> 0
|
||||
for(defi = 23; defi <= 26; ++defi) default_map[defi] = 0;
|
||||
|
||||
// 27 -> 14 ... 31 -> 14
|
||||
for(defi = 27; defi <= 31; ++defi) default_map[defi] = 14;
|
||||
// 50 -> 14 ... 58 -> 14
|
||||
for(defi = 50; defi <= 58; ++defi) default_map[defi] = 14;
|
||||
|
||||
// 59 -> 1 ... 62 -> 4
|
||||
for(defi = 59; defi <= 62; ++defi) default_map[defi] = defi - 58;
|
||||
// 67 -> 9 ... 68 -> 10
|
||||
for(defi = 67; defi <= 68; ++defi) default_map[defi] = defi - 58;
|
||||
// 72 -> 14 ... 75 -> 17
|
||||
for(defi = 72; defi <= 75; ++defi) default_map[defi] = defi - 58;
|
||||
|
||||
// 69 -> 12 ... 71 -> 14
|
||||
for(defi = 67; defi <= 68; ++defi) default_map[defi] = defi - 57;
|
||||
|
||||
// 76 -> 20 ... 78 -> 22
|
||||
for(defi = 76; defi <= 78; ++defi) default_map[defi] = defi - 56;
|
||||
|
||||
// 79 -> 45 ... 81 -> 47
|
||||
for(defi = 79; defi <= 81; ++defi) default_map[defi] = defi - 34;
|
||||
|
||||
// 82 -> 0 ... 65536 -> 0 (omitted)
|
||||
|
||||
/* These formats technically refer to Accounting formats with no equivalent */
|
||||
var default_str/*:Array<string>*/ = [];
|
||||
|
||||
// 5 -- Currency, 0 decimal, black negative
|
||||
default_str[5] = default_str[63] = '"$"#,##0_);\\("$"#,##0\\)';
|
||||
// 6 -- Currency, 0 decimal, red negative
|
||||
default_str[6] = default_str[64] = '"$"#,##0_);[Red]\\("$"#,##0\\)';
|
||||
// 7 -- Currency, 2 decimal, black negative
|
||||
default_str[7] = default_str[65] = '"$"#,##0.00_);\\("$"#,##0.00\\)';
|
||||
// 8 -- Currency, 2 decimal, red negative
|
||||
default_str[8] = default_str[66] = '"$"#,##0.00_);[Red]\\("$"#,##0.00\\)';
|
||||
|
||||
// 41 -- Accounting, 0 decimal, No Symbol
|
||||
default_str[41] = '_(* #,##0_);_(* \\(#,##0\\);_(* "-"_);_(@_)';
|
||||
// 42 -- Accounting, 0 decimal, $ Symbol
|
||||
default_str[42] = '_("$"* #,##0_);_("$"* \\(#,##0\\);_("$"* "-"_);_(@_)';
|
||||
// 43 -- Accounting, 2 decimal, No Symbol
|
||||
default_str[43] = '_(* #,##0.00_);_(* \\(#,##0.00\\);_(* "-"??_);_(@_)';
|
||||
// 44 -- Accounting, 2 decimal, $ Symbol
|
||||
default_str[44] = '_("$"* #,##0.00_);_("$"* \\(#,##0.00\\);_("$"* "-"??_);_(@_)';
|
20
packages/ssf/bits/30_frac.js
Normal file
20
packages/ssf/bits/30_frac.js
Normal file
@ -0,0 +1,20 @@
|
||||
function frac(x/*:number*/, D/*:number*/, mixed/*:?boolean*/)/*:Array<number>*/ {
|
||||
var sgn = x < 0 ? -1 : 1;
|
||||
var B = x * sgn;
|
||||
var P_2 = 0, P_1 = 1, P = 0;
|
||||
var Q_2 = 1, Q_1 = 0, Q = 0;
|
||||
var A = Math.floor(B);
|
||||
while(Q_1 < D) {
|
||||
A = Math.floor(B);
|
||||
P = A * P_1 + P_2;
|
||||
Q = A * Q_1 + Q_2;
|
||||
if((B - A) < 0.00000005) break;
|
||||
B = 1 / (B - A);
|
||||
P_2 = P_1; P_1 = P;
|
||||
Q_2 = Q_1; Q_1 = Q;
|
||||
}
|
||||
if(Q > D) { if(Q_1 > D) { Q = Q_2; P = P_2; } else { Q = Q_1; P = P_1; } }
|
||||
if(!mixed) return [0, sgn * P, Q];
|
||||
var q = Math.floor(sgn * P/Q);
|
||||
return [q, sgn*P - q*Q, Q];
|
||||
}
|
40
packages/ssf/bits/35_datecode.js
Normal file
40
packages/ssf/bits/35_datecode.js
Normal file
@ -0,0 +1,40 @@
|
||||
function parse_date_code(v/*:number*/,opts/*:?any*/,b2/*:?boolean*/) {
|
||||
if(v > 2958465 || v < 0) return null;
|
||||
var date = (v|0), time = Math.floor(86400 * (v - date)), dow=0;
|
||||
var dout=[];
|
||||
var out={D:date, T:time, u:86400*(v-date)-time,y:0,m:0,d:0,H:0,M:0,S:0,q:0};
|
||||
if(Math.abs(out.u) < 1e-6) out.u = 0;
|
||||
if(opts && opts.date1904) date += 1462;
|
||||
if(out.u > 0.9999) {
|
||||
out.u = 0;
|
||||
if(++time == 86400) { out.T = time = 0; ++date; ++out.D; }
|
||||
}
|
||||
if(date === 60) {dout = b2 ? [1317,10,29] : [1900,2,29]; dow=3;}
|
||||
else if(date === 0) {dout = b2 ? [1317,8,29] : [1900,1,0]; dow=6;}
|
||||
else {
|
||||
if(date > 60) --date;
|
||||
/* 1 = Jan 1 1900 in Gregorian */
|
||||
var d = new Date(1900, 0, 1);
|
||||
d.setDate(d.getDate() + date - 1);
|
||||
dout = [d.getFullYear(), d.getMonth()+1,d.getDate()];
|
||||
dow = d.getDay();
|
||||
if(date < 60) dow = (dow + 6) % 7;
|
||||
if(b2) dow = fix_hijri(d, dout);
|
||||
}
|
||||
out.y = dout[0]; out.m = dout[1]; out.d = dout[2];
|
||||
out.S = time % 60; time = Math.floor(time / 60);
|
||||
out.M = time % 60; time = Math.floor(time / 60);
|
||||
out.H = time;
|
||||
out.q = dow;
|
||||
return out;
|
||||
}
|
||||
SSF.parse_date_code = parse_date_code;
|
||||
var basedate = new Date(1899, 11, 31, 0, 0, 0);
|
||||
var dnthresh = basedate.getTime();
|
||||
var base1904 = new Date(1900, 2, 1, 0, 0, 0);
|
||||
function datenum_local(v/*:Date*/, date1904/*:?boolean*/)/*:number*/ {
|
||||
var epoch = v.getTime();
|
||||
if(date1904) epoch -= 1461*24*60*60*1000;
|
||||
else if(v >= base1904) epoch += 24*60*60*1000;
|
||||
return (epoch - (dnthresh + (v.getTimezoneOffset() - basedate.getTimezoneOffset()) * 60000)) / (24 * 60 * 60 * 1000);
|
||||
}
|
71
packages/ssf/bits/40_general.js
Normal file
71
packages/ssf/bits/40_general.js
Normal file
@ -0,0 +1,71 @@
|
||||
/* The longest 32-bit integer text is "-4294967296", exactly 11 chars */
|
||||
function general_fmt_int(v/*:number*/)/*:string*/ { return v.toString(10); }
|
||||
SSF._general_int = general_fmt_int;
|
||||
|
||||
/* ECMA-376 18.8.30 numFmt*/
|
||||
/* Note: `toPrecision` uses standard form when prec > E and E >= -6 */
|
||||
var general_fmt_num = (function make_general_fmt_num() {
|
||||
var trailing_zeroes_and_decimal = /(?:\.0*|(\.\d*[1-9])0+)$/;
|
||||
function strip_decimal(o/*:string*/)/*:string*/ {
|
||||
return (o.indexOf(".") == -1) ? o : o.replace(trailing_zeroes_and_decimal, "$1");
|
||||
}
|
||||
|
||||
/* General Exponential always shows 2 digits exp and trims the mantissa */
|
||||
var mantissa_zeroes_and_decimal = /(?:\.0*|(\.\d*[1-9])0+)[Ee]/;
|
||||
var exp_with_single_digit = /(E[+-])(\d)$/;
|
||||
function normalize_exp(o/*:string*/)/*:string*/ {
|
||||
if(o.indexOf("E") == -1) return o;
|
||||
return o.replace(mantissa_zeroes_and_decimal,"$1E").replace(exp_with_single_digit,"$10$2");
|
||||
}
|
||||
|
||||
/* exponent >= -9 and <= 9 */
|
||||
function small_exp(v/*:number*/)/*:string*/ {
|
||||
var w = (v<0?12:11);
|
||||
var o = strip_decimal(v.toFixed(12)); if(o.length <= w) return o;
|
||||
o = v.toPrecision(10); if(o.length <= w) return o;
|
||||
return v.toExponential(5);
|
||||
}
|
||||
|
||||
/* exponent >= 11 or <= -10 likely exponential */
|
||||
function large_exp(v/*:number*/)/*:string*/ {
|
||||
var o = strip_decimal(v.toFixed(11));
|
||||
return (o.length > (v<0?12:11) || o === "0" || o === "-0") ? v.toPrecision(6) : o;
|
||||
}
|
||||
|
||||
function general_fmt_num_base(v/*:number*/)/*:string*/ {
|
||||
var V = Math.floor(Math.log(Math.abs(v))*Math.LOG10E), o;
|
||||
|
||||
if(V >= -4 && V <= -1) o = v.toPrecision(10+V);
|
||||
else if(Math.abs(V) <= 9) o = small_exp(v);
|
||||
else if(V === 10) o = v.toFixed(10).substr(0,12);
|
||||
else o = large_exp(v);
|
||||
|
||||
return strip_decimal(normalize_exp(o.toUpperCase()));
|
||||
}
|
||||
|
||||
return general_fmt_num_base;
|
||||
})();
|
||||
SSF._general_num = general_fmt_num;
|
||||
|
||||
/*
|
||||
"General" rules:
|
||||
- text is passed through ("@")
|
||||
- booleans are rendered as TRUE/FALSE
|
||||
- "up to 11 characters" displayed for numbers
|
||||
- Default date format (code 14) used for Dates
|
||||
|
||||
TODO: technically the display depends on the width of the cell
|
||||
*/
|
||||
function general_fmt(v/*:any*/, opts/*:any*/) {
|
||||
switch(typeof v) {
|
||||
case 'string': return v;
|
||||
case 'boolean': return v ? "TRUE" : "FALSE";
|
||||
case 'number': return (v|0) === v ? v.toString(10) : general_fmt_num(v);
|
||||
case 'undefined': return "";
|
||||
case 'object':
|
||||
if(v == null) return "";
|
||||
if(v instanceof Date) return format(14, datenum_local(v, opts && opts.date1904), opts);
|
||||
}
|
||||
throw new Error("unsupported value in General format: " + v);
|
||||
}
|
||||
SSF._general = general_fmt;
|
7
packages/ssf/bits/45_hijri.js
Normal file
7
packages/ssf/bits/45_hijri.js
Normal file
@ -0,0 +1,7 @@
|
||||
function fix_hijri(date/*:Date*/, o/*:[number, number, number]*/) {
|
||||
/* TODO: properly adjust y/m/d and */
|
||||
o[0] -= 581;
|
||||
var dow = date.getDay();
|
||||
if(date < 60) dow = (dow + 6) % 7;
|
||||
return dow;
|
||||
}
|
1
packages/ssf/bits/49_thaidigits.js
Normal file
1
packages/ssf/bits/49_thaidigits.js
Normal file
@ -0,0 +1 @@
|
||||
var THAI_DIGITS = "\u0E50\u0E51\u0E52\u0E53\u0E54\u0E55\u0E56\u0E57\u0E58\u0E59".split("");
|
66
packages/ssf/bits/50_date.js
Normal file
66
packages/ssf/bits/50_date.js
Normal file
@ -0,0 +1,66 @@
|
||||
/*jshint -W086 */
|
||||
function write_date(type/*:number*/, fmt/*:string*/, val, ss0/*:?number*/)/*:string*/ {
|
||||
var o="", ss=0, tt=0, y = val.y, out, outl = 0;
|
||||
switch(type) {
|
||||
case 98: /* 'b' buddhist year */
|
||||
y = val.y + 543;
|
||||
/* falls through */
|
||||
case 121: /* 'y' year */
|
||||
switch(fmt.length) {
|
||||
case 1: case 2: out = y % 100; outl = 2; break;
|
||||
default: out = y % 10000; outl = 4; break;
|
||||
} break;
|
||||
case 109: /* 'm' month */
|
||||
switch(fmt.length) {
|
||||
case 1: case 2: out = val.m; outl = fmt.length; break;
|
||||
case 3: return months[val.m-1][1];
|
||||
case 5: return months[val.m-1][0];
|
||||
default: return months[val.m-1][2];
|
||||
} break;
|
||||
case 100: /* 'd' day */
|
||||
switch(fmt.length) {
|
||||
case 1: case 2: out = val.d; outl = fmt.length; break;
|
||||
case 3: return days[val.q][0];
|
||||
default: return days[val.q][1];
|
||||
} break;
|
||||
case 104: /* 'h' 12-hour */
|
||||
switch(fmt.length) {
|
||||
case 1: case 2: out = 1+(val.H+11)%12; outl = fmt.length; break;
|
||||
default: throw 'bad hour format: ' + fmt;
|
||||
} break;
|
||||
case 72: /* 'H' 24-hour */
|
||||
switch(fmt.length) {
|
||||
case 1: case 2: out = val.H; outl = fmt.length; break;
|
||||
default: throw 'bad hour format: ' + fmt;
|
||||
} break;
|
||||
case 77: /* 'M' minutes */
|
||||
switch(fmt.length) {
|
||||
case 1: case 2: out = val.M; outl = fmt.length; break;
|
||||
default: throw 'bad minute format: ' + fmt;
|
||||
} break;
|
||||
case 115: /* 's' seconds */
|
||||
if(fmt != 's' && fmt != 'ss' && fmt != '.0' && fmt != '.00' && fmt != '.000') throw 'bad second format: ' + fmt;
|
||||
if(val.u === 0 && (fmt == "s" || fmt == "ss")) return pad0(val.S, fmt.length);
|
||||
/*::if(!ss0) ss0 = 0; */
|
||||
if(ss0 >= 2) tt = ss0 === 3 ? 1000 : 100;
|
||||
else tt = ss0 === 1 ? 10 : 1;
|
||||
ss = Math.round((tt)*(val.S + val.u));
|
||||
if(ss >= 60*tt) ss = 0;
|
||||
if(fmt === 's') return ss === 0 ? "0" : ""+ss/tt;
|
||||
o = pad0(ss,2 + ss0);
|
||||
if(fmt === 'ss') return o.substr(0,2);
|
||||
return "." + o.substr(2,fmt.length-1);
|
||||
case 90: /* 'Z' absolute time */
|
||||
switch(fmt) {
|
||||
case '[h]': case '[hh]': out = val.D*24+val.H; break;
|
||||
case '[m]': case '[mm]': out = (val.D*24+val.H)*60+val.M; break;
|
||||
case '[s]': case '[ss]': out = ((val.D*24+val.H)*60+val.M)*60+Math.round(val.S+val.u); break;
|
||||
default: throw 'bad abstime format: ' + fmt;
|
||||
} outl = fmt.length === 3 ? 1 : 2; break;
|
||||
case 101: /* 'e' era */
|
||||
out = y; outl = 1; break;
|
||||
}
|
||||
var outstr = outl > 0 ? pad0(out, outl) : "";
|
||||
return outstr;
|
||||
}
|
||||
/*jshint +W086 */
|
7
packages/ssf/bits/56_commaify.js
Normal file
7
packages/ssf/bits/56_commaify.js
Normal file
@ -0,0 +1,7 @@
|
||||
function commaify(s/*:string*/)/*:string*/ {
|
||||
var w = 3;
|
||||
if(s.length <= w) return s;
|
||||
var j = (s.length % w), o = s.substr(0,j);
|
||||
for(; j!=s.length; j+=w) o+=(o.length > 0 ? "," : "") + s.substr(j,w);
|
||||
return o;
|
||||
}
|
1
packages/ssf/bits/57_numhead.js
Normal file
1
packages/ssf/bits/57_numhead.js
Normal file
@ -0,0 +1 @@
|
||||
var write_num/*:SSF_write_num*/ = (function make_write_num(){
|
5
packages/ssf/bits/59_numhelp.js
Normal file
5
packages/ssf/bits/59_numhelp.js
Normal file
@ -0,0 +1,5 @@
|
||||
var pct1 = /%/g;
|
||||
function write_num_pct(type/*:string*/, fmt/*:string*/, val/*:number*/)/*:string*/{
|
||||
var sfmt = fmt.replace(pct1,""), mul = fmt.length - sfmt.length;
|
||||
return write_num(type, sfmt, val * Math.pow(10,2*mul)) + fill("%",mul);
|
||||
}
|
69
packages/ssf/bits/60_number.js
Normal file
69
packages/ssf/bits/60_number.js
Normal file
@ -0,0 +1,69 @@
|
||||
function write_num_cm(type/*:string*/, fmt/*:string*/, val/*:number*/)/*:string*/{
|
||||
var idx = fmt.length - 1;
|
||||
while(fmt.charCodeAt(idx-1) === 44) --idx;
|
||||
return write_num(type, fmt.substr(0,idx), val / Math.pow(10,3*(fmt.length-idx)));
|
||||
}
|
||||
function write_num_exp(fmt/*:string*/, val/*:number*/)/*:string*/{
|
||||
var o/*:string*/;
|
||||
var idx = fmt.indexOf("E") - fmt.indexOf(".") - 1;
|
||||
if(fmt.match(/^#+0.0E\+0$/)) {
|
||||
if(val == 0) return "0.0E+0";
|
||||
else if(val < 0) return "-" + write_num_exp(fmt, -val);
|
||||
var period = fmt.indexOf("."); if(period === -1) period=fmt.indexOf('E');
|
||||
var ee = Math.floor(Math.log(val)*Math.LOG10E)%period;
|
||||
if(ee < 0) ee += period;
|
||||
o = (val/Math.pow(10,ee)).toPrecision(idx+1+(period+ee)%period);
|
||||
if(o.indexOf("e") === -1) {
|
||||
var fakee = Math.floor(Math.log(val)*Math.LOG10E);
|
||||
if(o.indexOf(".") === -1) o = o.charAt(0) + "." + o.substr(1) + "E+" + (fakee - o.length+ee);
|
||||
else o += "E+" + (fakee - ee);
|
||||
while(o.substr(0,2) === "0.") {
|
||||
o = o.charAt(0) + o.substr(2,period) + "." + o.substr(2+period);
|
||||
o = o.replace(/^0+([1-9])/,"$1").replace(/^0+\./,"0.");
|
||||
}
|
||||
o = o.replace(/\+-/,"-");
|
||||
}
|
||||
o = o.replace(/^([+-]?)(\d*)\.(\d*)[Ee]/,function($$,$1,$2,$3) { return $1 + $2 + $3.substr(0,(period+ee)%period) + "." + $3.substr(ee) + "E"; });
|
||||
} else o = val.toExponential(idx);
|
||||
if(fmt.match(/E\+00$/) && o.match(/e[+-]\d$/)) o = o.substr(0,o.length-1) + "0" + o.charAt(o.length-1);
|
||||
if(fmt.match(/E\-/) && o.match(/e\+/)) o = o.replace(/e\+/,"e");
|
||||
return o.replace("e","E");
|
||||
}
|
||||
var frac1 = /# (\?+)( ?)\/( ?)(\d+)/;
|
||||
function write_num_f1(r/*:Array<string>*/, aval/*:number*/, sign/*:string*/)/*:string*/ {
|
||||
var den = parseInt(r[4],10), rr = Math.round(aval * den), base = Math.floor(rr/den);
|
||||
var myn = (rr - base*den), myd = den;
|
||||
return sign + (base === 0 ? "" : ""+base) + " " + (myn === 0 ? fill(" ", r[1].length + 1 + r[4].length) : pad_(myn,r[1].length) + r[2] + "/" + r[3] + pad0(myd,r[4].length));
|
||||
}
|
||||
function write_num_f2(r/*:Array<string>*/, aval/*:number*/, sign/*:string*/)/*:string*/ {
|
||||
return sign + (aval === 0 ? "" : ""+aval) + fill(" ", r[1].length + 2 + r[4].length);
|
||||
}
|
||||
var dec1 = /^#*0*\.([0#]+)/;
|
||||
var closeparen = /\).*[0#]/;
|
||||
var phone = /\(###\) ###\\?-####/;
|
||||
function hashq(str/*:string*/)/*:string*/ {
|
||||
var o = "", cc;
|
||||
for(var i = 0; i != str.length; ++i) switch((cc=str.charCodeAt(i))) {
|
||||
case 35: break;
|
||||
case 63: o+= " "; break;
|
||||
case 48: o+= "0"; break;
|
||||
default: o+= String.fromCharCode(cc);
|
||||
}
|
||||
return o;
|
||||
}
|
||||
function rnd(val/*:number*/, d/*:number*/)/*:string*/ { var dd = Math.pow(10,d); return ""+(Math.round(val * dd)/dd); }
|
||||
function dec(val/*:number*/, d/*:number*/)/*:number*/ {
|
||||
var _frac = val - Math.floor(val), dd = Math.pow(10,d);
|
||||
if (d < ('' + Math.round(_frac * dd)).length) return 0;
|
||||
return Math.round(_frac * dd);
|
||||
}
|
||||
function carry(val/*:number*/, d/*:number*/)/*:number*/ {
|
||||
if (d < ('' + Math.round((val-Math.floor(val))*Math.pow(10,d))).length) {
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
function flr(val/*:number*/)/*:string*/ {
|
||||
if(val < 2147483647 && val > -2147483648) return ""+(val >= 0 ? (val|0) : (val-1|0));
|
||||
return ""+Math.floor(val);
|
||||
}
|
85
packages/ssf/bits/63_numflt.js
Normal file
85
packages/ssf/bits/63_numflt.js
Normal file
@ -0,0 +1,85 @@
|
||||
function write_num_flt(type/*:string*/, fmt/*:string*/, val/*:number*/)/*:string*/ {
|
||||
if(type.charCodeAt(0) === 40 && !fmt.match(closeparen)) {
|
||||
var ffmt = fmt.replace(/\( */,"").replace(/ \)/,"").replace(/\)/,"");
|
||||
if(val >= 0) return write_num_flt('n', ffmt, val);
|
||||
return '(' + write_num_flt('n', ffmt, -val) + ')';
|
||||
}
|
||||
if(fmt.charCodeAt(fmt.length - 1) === 44) return write_num_cm(type, fmt, val);
|
||||
if(fmt.indexOf('%') !== -1) return write_num_pct(type, fmt, val);
|
||||
if(fmt.indexOf('E') !== -1) return write_num_exp(fmt, val);
|
||||
if(fmt.charCodeAt(0) === 36) return "$"+write_num_flt(type,fmt.substr(fmt.charAt(1)==' '?2:1),val);
|
||||
var o;
|
||||
var r/*:?Array<string>*/, ri, ff, aval = Math.abs(val), sign = val < 0 ? "-" : "";
|
||||
if(fmt.match(/^00+$/)) return sign + pad0r(aval,fmt.length);
|
||||
if(fmt.match(/^[#?]+$/)) {
|
||||
o = pad0r(val,0); if(o === "0") o = "";
|
||||
return o.length > fmt.length ? o : hashq(fmt.substr(0,fmt.length-o.length)) + o;
|
||||
}
|
||||
if((r = fmt.match(frac1))) return write_num_f1(r, aval, sign);
|
||||
if(fmt.match(/^#+0+$/)) return sign + pad0r(aval,fmt.length - fmt.indexOf("0"));
|
||||
if((r = fmt.match(dec1))) {
|
||||
o = rnd(val, r[1].length).replace(/^([^\.]+)$/,"$1."+hashq(r[1])).replace(/\.$/,"."+hashq(r[1])).replace(/\.(\d*)$/,function($$, $1) { return "." + $1 + fill("0", hashq(/*::(*/r/*::||[""])*/[1]).length-$1.length); });
|
||||
return fmt.indexOf("0.") !== -1 ? o : o.replace(/^0\./,".");
|
||||
}
|
||||
fmt = fmt.replace(/^#+([0.])/, "$1");
|
||||
if((r = fmt.match(/^(0*)\.(#*)$/))) {
|
||||
return sign + rnd(aval, r[2].length).replace(/\.(\d*[1-9])0*$/,".$1").replace(/^(-?\d*)$/,"$1.").replace(/^0\./,r[1].length?"0.":".");
|
||||
}
|
||||
if((r = fmt.match(/^#{1,3},##0(\.?)$/))) return sign + commaify(pad0r(aval,0));
|
||||
if((r = fmt.match(/^#,##0\.([#0]*0)$/))) {
|
||||
return val < 0 ? "-" + write_num_flt(type, fmt, -val) : commaify(""+(Math.floor(val) + carry(val, r[1].length))) + "." + pad0(dec(val, r[1].length),r[1].length);
|
||||
}
|
||||
if((r = fmt.match(/^#,#*,#0/))) return write_num_flt(type,fmt.replace(/^#,#*,/,""),val);
|
||||
if((r = fmt.match(/^([0#]+)(\\?-([0#]+))+$/))) {
|
||||
o = _strrev(write_num_flt(type, fmt.replace(/[\\-]/g,""), val));
|
||||
ri = 0;
|
||||
return _strrev(_strrev(fmt.replace(/\\/g,"")).replace(/[0#]/g,function(x){return ri<o.length?o.charAt(ri++):x==='0'?'0':"";}));
|
||||
}
|
||||
if(fmt.match(phone)) {
|
||||
o = write_num_flt(type, "##########", val);
|
||||
return "(" + o.substr(0,3) + ") " + o.substr(3, 3) + "-" + o.substr(6);
|
||||
}
|
||||
var oa = "";
|
||||
if((r = fmt.match(/^([#0?]+)( ?)\/( ?)([#0?]+)/))) {
|
||||
ri = Math.min(/*::String(*/r[4]/*::)*/.length,7);
|
||||
ff = frac(aval, Math.pow(10,ri)-1, false);
|
||||
o = "" + sign;
|
||||
oa = write_num("n", /*::String(*/r[1]/*::)*/, ff[1]);
|
||||
if(oa.charAt(oa.length-1) == " ") oa = oa.substr(0,oa.length-1) + "0";
|
||||
o += oa + /*::String(*/r[2]/*::)*/ + "/" + /*::String(*/r[3]/*::)*/;
|
||||
oa = rpad_(ff[2],ri);
|
||||
if(oa.length < r[4].length) oa = hashq(r[4].substr(r[4].length-oa.length)) + oa;
|
||||
o += oa;
|
||||
return o;
|
||||
}
|
||||
if((r = fmt.match(/^# ([#0?]+)( ?)\/( ?)([#0?]+)/))) {
|
||||
ri = Math.min(Math.max(r[1].length, r[4].length),7);
|
||||
ff = frac(aval, Math.pow(10,ri)-1, true);
|
||||
return sign + (ff[0]||(ff[1] ? "" : "0")) + " " + (ff[1] ? pad_(ff[1],ri) + r[2] + "/" + r[3] + rpad_(ff[2],ri): fill(" ", 2*ri+1 + r[2].length + r[3].length));
|
||||
}
|
||||
if((r = fmt.match(/^[#0?]+$/))) {
|
||||
o = pad0r(val, 0);
|
||||
if(fmt.length <= o.length) return o;
|
||||
return hashq(fmt.substr(0,fmt.length-o.length)) + o;
|
||||
}
|
||||
if((r = fmt.match(/^([#0?]+)\.([#0]+)$/))) {
|
||||
o = "" + val.toFixed(Math.min(r[2].length,10)).replace(/([^0])0+$/,"$1");
|
||||
ri = o.indexOf(".");
|
||||
var lres = fmt.indexOf(".") - ri, rres = fmt.length - o.length - lres;
|
||||
return hashq(fmt.substr(0,lres) + o + fmt.substr(fmt.length-rres));
|
||||
}
|
||||
if((r = fmt.match(/^00,000\.([#0]*0)$/))) {
|
||||
ri = dec(val, r[1].length);
|
||||
return val < 0 ? "-" + write_num_flt(type, fmt, -val) : commaify(flr(val)).replace(/^\d,\d{3}$/,"0$&").replace(/^\d*$/,function($$) { return "00," + ($$.length < 3 ? pad0(0,3-$$.length) : "") + $$; }) + "." + pad0(ri,r[1].length);
|
||||
}
|
||||
switch(fmt) {
|
||||
case "###,##0.00": return write_num_flt(type, "#,##0.00", val);
|
||||
case "###,###":
|
||||
case "##,###":
|
||||
case "#,###": var x = commaify(pad0r(aval,0)); return x !== "0" ? sign + x : "";
|
||||
case "###,###.00": return write_num_flt(type, "###,##0.00",val).replace(/^0\./,".");
|
||||
case "#,###.00": return write_num_flt(type, "#,##0.00",val).replace(/^0\./,".");
|
||||
default:
|
||||
}
|
||||
throw new Error("unsupported format |" + fmt + "|");
|
||||
}
|
31
packages/ssf/bits/65_numinth.js
Normal file
31
packages/ssf/bits/65_numinth.js
Normal file
@ -0,0 +1,31 @@
|
||||
function write_num_cm2(type/*:string*/, fmt/*:string*/, val/*:number*/)/*:string*/{
|
||||
var idx = fmt.length - 1;
|
||||
while(fmt.charCodeAt(idx-1) === 44) --idx;
|
||||
return write_num(type, fmt.substr(0,idx), val / Math.pow(10,3*(fmt.length-idx)));
|
||||
}
|
||||
function write_num_pct2(type/*:string*/, fmt/*:string*/, val/*:number*/)/*:string*/{
|
||||
var sfmt = fmt.replace(pct1,""), mul = fmt.length - sfmt.length;
|
||||
return write_num(type, sfmt, val * Math.pow(10,2*mul)) + fill("%",mul);
|
||||
}
|
||||
function write_num_exp2(fmt/*:string*/, val/*:number*/)/*:string*/{
|
||||
var o/*:string*/;
|
||||
var idx = fmt.indexOf("E") - fmt.indexOf(".") - 1;
|
||||
if(fmt.match(/^#+0.0E\+0$/)) {
|
||||
if(val == 0) return "0.0E+0";
|
||||
else if(val < 0) return "-" + write_num_exp2(fmt, -val);
|
||||
var period = fmt.indexOf("."); if(period === -1) period=fmt.indexOf('E');
|
||||
var ee = Math.floor(Math.log(val)*Math.LOG10E)%period;
|
||||
if(ee < 0) ee += period;
|
||||
o = (val/Math.pow(10,ee)).toPrecision(idx+1+(period+ee)%period);
|
||||
if(!o.match(/[Ee]/)) {
|
||||
var fakee = Math.floor(Math.log(val)*Math.LOG10E);
|
||||
if(o.indexOf(".") === -1) o = o.charAt(0) + "." + o.substr(1) + "E+" + (fakee - o.length+ee);
|
||||
else o += "E+" + (fakee - ee);
|
||||
o = o.replace(/\+-/,"-");
|
||||
}
|
||||
o = o.replace(/^([+-]?)(\d*)\.(\d*)[Ee]/,function($$,$1,$2,$3) { return $1 + $2 + $3.substr(0,(period+ee)%period) + "." + $3.substr(ee) + "E"; });
|
||||
} else o = val.toExponential(idx);
|
||||
if(fmt.match(/E\+00$/) && o.match(/e[+-]\d$/)) o = o.substr(0,o.length-1) + "0" + o.charAt(o.length-1);
|
||||
if(fmt.match(/E\-/) && o.match(/e\+/)) o = o.replace(/e\+/,"e");
|
||||
return o.replace("e","E");
|
||||
}
|
86
packages/ssf/bits/66_numint.js
Normal file
86
packages/ssf/bits/66_numint.js
Normal file
@ -0,0 +1,86 @@
|
||||
function write_num_int(type/*:string*/, fmt/*:string*/, val/*:number*/)/*:string*/ {
|
||||
if(type.charCodeAt(0) === 40 && !fmt.match(closeparen)) {
|
||||
var ffmt = fmt.replace(/\( */,"").replace(/ \)/,"").replace(/\)/,"");
|
||||
if(val >= 0) return write_num_int('n', ffmt, val);
|
||||
return '(' + write_num_int('n', ffmt, -val) + ')';
|
||||
}
|
||||
if(fmt.charCodeAt(fmt.length - 1) === 44) return write_num_cm2(type, fmt, val);
|
||||
if(fmt.indexOf('%') !== -1) return write_num_pct2(type, fmt, val);
|
||||
if(fmt.indexOf('E') !== -1) return write_num_exp2(fmt, val);
|
||||
if(fmt.charCodeAt(0) === 36) return "$"+write_num_int(type,fmt.substr(fmt.charAt(1)==' '?2:1),val);
|
||||
var o;
|
||||
var r/*:?Array<string>*/, ri, ff, aval = Math.abs(val), sign = val < 0 ? "-" : "";
|
||||
if(fmt.match(/^00+$/)) return sign + pad0(aval,fmt.length);
|
||||
if(fmt.match(/^[#?]+$/)) {
|
||||
o = (""+val); if(val === 0) o = "";
|
||||
return o.length > fmt.length ? o : hashq(fmt.substr(0,fmt.length-o.length)) + o;
|
||||
}
|
||||
if((r = fmt.match(frac1))) return write_num_f2(r, aval, sign);
|
||||
if(fmt.match(/^#+0+$/)) return sign + pad0(aval,fmt.length - fmt.indexOf("0"));
|
||||
if((r = fmt.match(dec1))) {
|
||||
/*:: if(!Array.isArray(r)) throw new Error("unreachable"); */
|
||||
o = (""+val).replace(/^([^\.]+)$/,"$1."+hashq(r[1])).replace(/\.$/,"."+hashq(r[1]));
|
||||
o = o.replace(/\.(\d*)$/,function($$, $1) {
|
||||
/*:: if(!Array.isArray(r)) throw new Error("unreachable"); */
|
||||
return "." + $1 + fill("0", hashq(r[1]).length-$1.length); });
|
||||
return fmt.indexOf("0.") !== -1 ? o : o.replace(/^0\./,".");
|
||||
}
|
||||
fmt = fmt.replace(/^#+([0.])/, "$1");
|
||||
if((r = fmt.match(/^(0*)\.(#*)$/))) {
|
||||
return sign + (""+aval).replace(/\.(\d*[1-9])0*$/,".$1").replace(/^(-?\d*)$/,"$1.").replace(/^0\./,r[1].length?"0.":".");
|
||||
}
|
||||
if((r = fmt.match(/^#{1,3},##0(\.?)$/))) return sign + commaify((""+aval));
|
||||
if((r = fmt.match(/^#,##0\.([#0]*0)$/))) {
|
||||
return val < 0 ? "-" + write_num_int(type, fmt, -val) : commaify((""+val)) + "." + fill('0',r[1].length);
|
||||
}
|
||||
if((r = fmt.match(/^#,#*,#0/))) return write_num_int(type,fmt.replace(/^#,#*,/,""),val);
|
||||
if((r = fmt.match(/^([0#]+)(\\?-([0#]+))+$/))) {
|
||||
o = _strrev(write_num_int(type, fmt.replace(/[\\-]/g,""), val));
|
||||
ri = 0;
|
||||
return _strrev(_strrev(fmt.replace(/\\/g,"")).replace(/[0#]/g,function(x){return ri<o.length?o.charAt(ri++):x==='0'?'0':"";}));
|
||||
}
|
||||
if(fmt.match(phone)) {
|
||||
o = write_num_int(type, "##########", val);
|
||||
return "(" + o.substr(0,3) + ") " + o.substr(3, 3) + "-" + o.substr(6);
|
||||
}
|
||||
var oa = "";
|
||||
if((r = fmt.match(/^([#0?]+)( ?)\/( ?)([#0?]+)/))) {
|
||||
ri = Math.min(/*::String(*/r[4]/*::)*/.length,7);
|
||||
ff = frac(aval, Math.pow(10,ri)-1, false);
|
||||
o = "" + sign;
|
||||
oa = write_num("n", /*::String(*/r[1]/*::)*/, ff[1]);
|
||||
if(oa.charAt(oa.length-1) == " ") oa = oa.substr(0,oa.length-1) + "0";
|
||||
o += oa + /*::String(*/r[2]/*::)*/ + "/" + /*::String(*/r[3]/*::)*/;
|
||||
oa = rpad_(ff[2],ri);
|
||||
if(oa.length < r[4].length) oa = hashq(r[4].substr(r[4].length-oa.length)) + oa;
|
||||
o += oa;
|
||||
return o;
|
||||
}
|
||||
if((r = fmt.match(/^# ([#0?]+)( ?)\/( ?)([#0?]+)/))) {
|
||||
ri = Math.min(Math.max(r[1].length, r[4].length),7);
|
||||
ff = frac(aval, Math.pow(10,ri)-1, true);
|
||||
return sign + (ff[0]||(ff[1] ? "" : "0")) + " " + (ff[1] ? pad_(ff[1],ri) + r[2] + "/" + r[3] + rpad_(ff[2],ri): fill(" ", 2*ri+1 + r[2].length + r[3].length));
|
||||
}
|
||||
if((r = fmt.match(/^[#0?]+$/))) {
|
||||
o = "" + val;
|
||||
if(fmt.length <= o.length) return o;
|
||||
return hashq(fmt.substr(0,fmt.length-o.length)) + o;
|
||||
}
|
||||
if((r = fmt.match(/^([#0]+)\.([#0]+)$/))) {
|
||||
o = "" + val.toFixed(Math.min(r[2].length,10)).replace(/([^0])0+$/,"$1");
|
||||
ri = o.indexOf(".");
|
||||
var lres = fmt.indexOf(".") - ri, rres = fmt.length - o.length - lres;
|
||||
return hashq(fmt.substr(0,lres) + o + fmt.substr(fmt.length-rres));
|
||||
}
|
||||
if((r = fmt.match(/^00,000\.([#0]*0)$/))) {
|
||||
return val < 0 ? "-" + write_num_int(type, fmt, -val) : commaify(""+val).replace(/^\d,\d{3}$/,"0$&").replace(/^\d*$/,function($$) { return "00," + ($$.length < 3 ? pad0(0,3-$$.length) : "") + $$; }) + "." + pad0(0,r[1].length);
|
||||
}
|
||||
switch(fmt) {
|
||||
case "###,###":
|
||||
case "##,###":
|
||||
case "#,###": var x = commaify(""+aval); return x !== "0" ? sign + x : "";
|
||||
default:
|
||||
if(fmt.match(/\.[0#?]*$/)) return write_num_int(type, fmt.slice(0,fmt.lastIndexOf(".")), val) + hashq(fmt.slice(fmt.lastIndexOf(".")));
|
||||
}
|
||||
throw new Error("unsupported format |" + fmt + "|");
|
||||
}
|
3
packages/ssf/bits/69_numfoot.js
Normal file
3
packages/ssf/bits/69_numfoot.js
Normal file
@ -0,0 +1,3 @@
|
||||
return function write_num(type/*:string*/, fmt/*:string*/, val/*:number*/)/*:string*/ {
|
||||
return (val|0) === val ? write_num_int(type, fmt, val) : write_num_flt(type, fmt, val);
|
||||
};})();
|
17
packages/ssf/bits/80_split.js
Normal file
17
packages/ssf/bits/80_split.js
Normal file
@ -0,0 +1,17 @@
|
||||
function split_fmt(fmt/*:string*/)/*:Array<string>*/ {
|
||||
var out/*:Array<string>*/ = [];
|
||||
var in_str = false/*, cc*/;
|
||||
for(var i = 0, j = 0; i < fmt.length; ++i) switch((/*cc=*/fmt.charCodeAt(i))) {
|
||||
case 34: /* '"' */
|
||||
in_str = !in_str; break;
|
||||
case 95: case 42: case 92: /* '_' '*' '\\' */
|
||||
++i; break;
|
||||
case 59: /* ';' */
|
||||
out[out.length] = fmt.substr(j,i-j);
|
||||
j = i+1;
|
||||
}
|
||||
out[out.length] = fmt.substr(j);
|
||||
if(in_str === true) throw new Error("Format |" + fmt + "| unterminated string ");
|
||||
return out;
|
||||
}
|
||||
SSF._split = split_fmt;
|
43
packages/ssf/bits/81_fmttype.js
Normal file
43
packages/ssf/bits/81_fmttype.js
Normal file
@ -0,0 +1,43 @@
|
||||
var abstime = /\[[HhMmSs\u0E0A\u0E19\u0E17]*\]/;
|
||||
function fmt_is_date(fmt/*:string*/)/*:boolean*/ {
|
||||
var i = 0, /*cc = 0,*/ c = "", o = "";
|
||||
while(i < fmt.length) {
|
||||
switch((c = fmt.charAt(i))) {
|
||||
case 'G': if(isgeneral(fmt, i)) i+= 6; i++; break;
|
||||
case '"': for(;(/*cc=*/fmt.charCodeAt(++i)) !== 34 && i < fmt.length;){/*empty*/} ++i; break;
|
||||
case '\\': i+=2; break;
|
||||
case '_': i+=2; break;
|
||||
case '@': ++i; break;
|
||||
case 'B': case 'b':
|
||||
if(fmt.charAt(i+1) === "1" || fmt.charAt(i+1) === "2") return true;
|
||||
/* falls through */
|
||||
case 'M': case 'D': case 'Y': case 'H': case 'S': case 'E':
|
||||
/* falls through */
|
||||
case 'm': case 'd': case 'y': case 'h': case 's': case 'e': case 'g': return true;
|
||||
case 'A': case 'a': case '上':
|
||||
if(fmt.substr(i, 3).toUpperCase() === "A/P") return true;
|
||||
if(fmt.substr(i, 5).toUpperCase() === "AM/PM") return true;
|
||||
if(fmt.substr(i, 5).toUpperCase() === "上午/下午") return true;
|
||||
++i; break;
|
||||
case '[':
|
||||
o = c;
|
||||
while(fmt.charAt(i++) !== ']' && i < fmt.length) o += fmt.charAt(i);
|
||||
if(o.match(abstime)) return true;
|
||||
break;
|
||||
case '.':
|
||||
/* falls through */
|
||||
case '0': case '#':
|
||||
while(i < fmt.length && ("0#?.,E+-%".indexOf(c=fmt.charAt(++i)) > -1 || (c=='\\' && fmt.charAt(i+1) == "-" && "0#".indexOf(fmt.charAt(i+2))>-1))){/* empty */}
|
||||
break;
|
||||
case '?': while(fmt.charAt(++i) === c){/* empty */} break;
|
||||
case '*': ++i; if(fmt.charAt(i) == ' ' || fmt.charAt(i) == '*') ++i; break;
|
||||
case '(': case ')': ++i; break;
|
||||
case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9':
|
||||
while(i < fmt.length && "0123456789".indexOf(fmt.charAt(++i)) > -1){/* empty */} break;
|
||||
case ' ': ++i; break;
|
||||
default: ++i; break;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
SSF.is_date = fmt_is_date;
|
208
packages/ssf/bits/82_eval.js
Normal file
208
packages/ssf/bits/82_eval.js
Normal file
@ -0,0 +1,208 @@
|
||||
function eval_fmt(fmt/*:string*/, v/*:any*/, opts/*:any*/, flen/*:number*/) {
|
||||
var out = [], o = "", i = 0, c = "", lst='t', dt, j, cc;
|
||||
var hr='H';
|
||||
/* Tokenize */
|
||||
while(i < fmt.length) {
|
||||
switch((c = fmt.charAt(i))) {
|
||||
case 'G': /* General */
|
||||
if(!isgeneral(fmt, i)) throw new Error('unrecognized character ' + c + ' in ' +fmt);
|
||||
out[out.length] = {t:'G', v:'General'}; i+=7; break;
|
||||
case '"': /* Literal text */
|
||||
for(o="";(cc=fmt.charCodeAt(++i)) !== 34 && i < fmt.length;) o += String.fromCharCode(cc);
|
||||
out[out.length] = {t:'t', v:o}; ++i; break;
|
||||
case '\\': var w = fmt.charAt(++i), t = (w === "(" || w === ")") ? w : 't';
|
||||
out[out.length] = {t:t, v:w}; ++i; break;
|
||||
case '_': out[out.length] = {t:'t', v:" "}; i+=2; break;
|
||||
case '@': /* Text Placeholder */
|
||||
out[out.length] = {t:'T', v:v}; ++i; break;
|
||||
case 'B': case 'b':
|
||||
if(fmt.charAt(i+1) === "1" || fmt.charAt(i+1) === "2") {
|
||||
if(dt==null) { dt=parse_date_code(v, opts, fmt.charAt(i+1) === "2"); if(dt==null) return ""; }
|
||||
out[out.length] = {t:'X', v:fmt.substr(i,2)}; lst = c; i+=2; break;
|
||||
}
|
||||
/* falls through */
|
||||
case 'M': case 'D': case 'Y': case 'H': case 'S': case 'E':
|
||||
c = c.toLowerCase();
|
||||
/* falls through */
|
||||
case 'm': case 'd': case 'y': case 'h': case 's': case 'e': case 'g':
|
||||
if(v < 0) return "";
|
||||
if(dt==null) { dt=parse_date_code(v, opts); if(dt==null) return ""; }
|
||||
o = c; while(++i < fmt.length && fmt.charAt(i).toLowerCase() === c) o+=c;
|
||||
if(c === 'm' && lst.toLowerCase() === 'h') c = 'M';
|
||||
if(c === 'h') c = hr;
|
||||
out[out.length] = {t:c, v:o}; lst = c; break;
|
||||
case 'A': case 'a': case '上':
|
||||
var q={t:c, v:c};
|
||||
if(dt==null) dt=parse_date_code(v, opts);
|
||||
if(fmt.substr(i, 3).toUpperCase() === "A/P") { if(dt!=null) q.v = dt.H >= 12 ? "P" : "A"; q.t = 'T'; hr='h';i+=3;}
|
||||
else if(fmt.substr(i,5).toUpperCase() === "AM/PM") { if(dt!=null) q.v = dt.H >= 12 ? "PM" : "AM"; q.t = 'T'; i+=5; hr='h'; }
|
||||
else if(fmt.substr(i,5).toUpperCase() === "上午/下午") { if(dt!=null) q.v = dt.H >= 12 ? "下午" : "上午"; q.t = 'T'; i+=5; hr='h'; }
|
||||
else { q.t = "t"; ++i; }
|
||||
if(dt==null && q.t === 'T') return "";
|
||||
out[out.length] = q; lst = c; break;
|
||||
case '[':
|
||||
o = c;
|
||||
while(fmt.charAt(i++) !== ']' && i < fmt.length) o += fmt.charAt(i);
|
||||
if(o.slice(-1) !== ']') throw 'unterminated "[" block: |' + o + '|';
|
||||
if(o.match(abstime)) {
|
||||
if(dt==null) { dt=parse_date_code(v, opts); if(dt==null) return ""; }
|
||||
out[out.length] = {t:'Z', v:o.toLowerCase()};
|
||||
lst = o.charAt(1);
|
||||
} else if(o.indexOf("$") > -1) {
|
||||
o = (o.match(/\$([^-\[\]]*)/)||[])[1]||"$";
|
||||
if(!fmt_is_date(fmt)) out[out.length] = {t:'t',v:o};
|
||||
}
|
||||
break;
|
||||
/* Numbers */
|
||||
case '.':
|
||||
if(dt != null) {
|
||||
o = c; while(++i < fmt.length && (c=fmt.charAt(i)) === "0") o += c;
|
||||
out[out.length] = {t:'s', v:o}; break;
|
||||
}
|
||||
/* falls through */
|
||||
case '0': case '#':
|
||||
o = c; while(++i < fmt.length && "0#?.,E+-%".indexOf(c=fmt.charAt(i)) > -1) o += c;
|
||||
out[out.length] = {t:'n', v:o}; break;
|
||||
case '?':
|
||||
o = c; while(fmt.charAt(++i) === c) o+=c;
|
||||
out[out.length] = {t:c, v:o}; lst = c; break;
|
||||
case '*': ++i; if(fmt.charAt(i) == ' ' || fmt.charAt(i) == '*') ++i; break; // **
|
||||
case '(': case ')': out[out.length] = {t:(flen===1?'t':c), v:c}; ++i; break;
|
||||
case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9':
|
||||
o = c; while(i < fmt.length && "0123456789".indexOf(fmt.charAt(++i)) > -1) o+=fmt.charAt(i);
|
||||
out[out.length] = {t:'D', v:o}; break;
|
||||
case ' ': out[out.length] = {t:c, v:c}; ++i; break;
|
||||
case '$': out[out.length] = {t:'t', v:'$'}; ++i; break;
|
||||
default:
|
||||
if(",$-+/():!^&'~{}<>=€acfijklopqrtuvwxzP".indexOf(c) === -1) throw new Error('unrecognized character ' + c + ' in ' + fmt);
|
||||
out[out.length] = {t:'t', v:c}; ++i; break;
|
||||
}
|
||||
}
|
||||
|
||||
/* Scan for date/time parts */
|
||||
var bt = 0, ss0 = 0, ssm;
|
||||
for(i=out.length-1, lst='t'; i >= 0; --i) {
|
||||
switch(out[i].t) {
|
||||
case 'h': case 'H': out[i].t = hr; lst='h'; if(bt < 1) bt = 1; break;
|
||||
case 's':
|
||||
if((ssm=out[i].v.match(/\.0+$/))) ss0=Math.max(ss0,ssm[0].length-1);
|
||||
if(bt < 3) bt = 3;
|
||||
/* falls through */
|
||||
case 'd': case 'y': case 'M': case 'e': lst=out[i].t; break;
|
||||
case 'm': if(lst === 's') { out[i].t = 'M'; if(bt < 2) bt = 2; } break;
|
||||
case 'X': /*if(out[i].v === "B2");*/
|
||||
break;
|
||||
case 'Z':
|
||||
if(bt < 1 && out[i].v.match(/[Hh]/)) bt = 1;
|
||||
if(bt < 2 && out[i].v.match(/[Mm]/)) bt = 2;
|
||||
if(bt < 3 && out[i].v.match(/[Ss]/)) bt = 3;
|
||||
}
|
||||
}
|
||||
/* time rounding depends on presence of minute / second / usec fields */
|
||||
switch(bt) {
|
||||
case 0: break;
|
||||
case 1:
|
||||
/*::if(!dt) break;*/
|
||||
if(dt.u >= 0.5) { dt.u = 0; ++dt.S; }
|
||||
if(dt.S >= 60) { dt.S = 0; ++dt.M; }
|
||||
if(dt.M >= 60) { dt.M = 0; ++dt.H; }
|
||||
break;
|
||||
case 2:
|
||||
/*::if(!dt) break;*/
|
||||
if(dt.u >= 0.5) { dt.u = 0; ++dt.S; }
|
||||
if(dt.S >= 60) { dt.S = 0; ++dt.M; }
|
||||
break;
|
||||
}
|
||||
|
||||
/* replace fields */
|
||||
var nstr = "", jj;
|
||||
for(i=0; i < out.length; ++i) {
|
||||
switch(out[i].t) {
|
||||
case 't': case 'T': case ' ': case 'D': break;
|
||||
case 'X': out[i].v = ""; out[i].t = ";"; break;
|
||||
case 'd': case 'm': case 'y': case 'h': case 'H': case 'M': case 's': case 'e': case 'b': case 'Z':
|
||||
/*::if(!dt) throw "unreachable"; */
|
||||
out[i].v = write_date(out[i].t.charCodeAt(0), out[i].v, dt, ss0);
|
||||
out[i].t = 't'; break;
|
||||
case 'n': case '?':
|
||||
jj = i+1;
|
||||
while(out[jj] != null && (
|
||||
(c=out[jj].t) === "?" || c === "D" ||
|
||||
((c === " " || c === "t") && out[jj+1] != null && (out[jj+1].t === '?' || out[jj+1].t === "t" && out[jj+1].v === '/')) ||
|
||||
(out[i].t === '(' && (c === ' ' || c === 'n' || c === ')')) ||
|
||||
(c === 't' && (out[jj].v === '/' || out[jj].v === ' ' && out[jj+1] != null && out[jj+1].t == '?'))
|
||||
)) {
|
||||
out[i].v += out[jj].v;
|
||||
out[jj] = {v:"", t:";"}; ++jj;
|
||||
}
|
||||
nstr += out[i].v;
|
||||
i = jj-1; break;
|
||||
case 'G': out[i].t = 't'; out[i].v = general_fmt(v,opts); break;
|
||||
}
|
||||
}
|
||||
var vv = "", myv, ostr;
|
||||
if(nstr.length > 0) {
|
||||
if(nstr.charCodeAt(0) == 40) /* '(' */ {
|
||||
myv = (v<0&&nstr.charCodeAt(0) === 45 ? -v : v);
|
||||
ostr = write_num('n', nstr, myv);
|
||||
} else {
|
||||
myv = (v<0 && flen > 1 ? -v : v);
|
||||
ostr = write_num('n', nstr, myv);
|
||||
if(myv < 0 && out[0] && out[0].t == 't') {
|
||||
ostr = ostr.substr(1);
|
||||
out[0].v = "-" + out[0].v;
|
||||
}
|
||||
}
|
||||
jj=ostr.length-1;
|
||||
var decpt = out.length;
|
||||
for(i=0; i < out.length; ++i) if(out[i] != null && out[i].t != 't' && out[i].v.indexOf(".") > -1) { decpt = i; break; }
|
||||
var lasti=out.length;
|
||||
if(decpt === out.length && ostr.indexOf("E") === -1) {
|
||||
for(i=out.length-1; i>= 0;--i) {
|
||||
if(out[i] == null || 'n?'.indexOf(out[i].t) === -1) continue;
|
||||
if(jj>=out[i].v.length-1) { jj -= out[i].v.length; out[i].v = ostr.substr(jj+1, out[i].v.length); }
|
||||
else if(jj < 0) out[i].v = "";
|
||||
else { out[i].v = ostr.substr(0, jj+1); jj = -1; }
|
||||
out[i].t = 't';
|
||||
lasti = i;
|
||||
}
|
||||
if(jj>=0 && lasti<out.length) out[lasti].v = ostr.substr(0,jj+1) + out[lasti].v;
|
||||
}
|
||||
else if(decpt !== out.length && ostr.indexOf("E") === -1) {
|
||||
jj = ostr.indexOf(".")-1;
|
||||
for(i=decpt; i>= 0; --i) {
|
||||
if(out[i] == null || 'n?'.indexOf(out[i].t) === -1) continue;
|
||||
j=out[i].v.indexOf(".")>-1&&i===decpt?out[i].v.indexOf(".")-1:out[i].v.length-1;
|
||||
vv = out[i].v.substr(j+1);
|
||||
for(; j>=0; --j) {
|
||||
if(jj>=0 && (out[i].v.charAt(j) === "0" || out[i].v.charAt(j) === "#")) vv = ostr.charAt(jj--) + vv;
|
||||
}
|
||||
out[i].v = vv;
|
||||
out[i].t = 't';
|
||||
lasti = i;
|
||||
}
|
||||
if(jj>=0 && lasti<out.length) out[lasti].v = ostr.substr(0,jj+1) + out[lasti].v;
|
||||
jj = ostr.indexOf(".")+1;
|
||||
for(i=decpt; i<out.length; ++i) {
|
||||
if(out[i] == null || ('n?('.indexOf(out[i].t) === -1 && i !== decpt)) continue;
|
||||
j=out[i].v.indexOf(".")>-1&&i===decpt?out[i].v.indexOf(".")+1:0;
|
||||
vv = out[i].v.substr(0,j);
|
||||
for(; j<out[i].v.length; ++j) {
|
||||
if(jj<ostr.length) vv += ostr.charAt(jj++);
|
||||
}
|
||||
out[i].v = vv;
|
||||
out[i].t = 't';
|
||||
lasti = i;
|
||||
}
|
||||
}
|
||||
}
|
||||
for(i=0; i<out.length; ++i) if(out[i] != null && 'n?'.indexOf(out[i].t)>-1) {
|
||||
myv = (flen >1 && v < 0 && i>0 && out[i-1].v === "-" ? -v:v);
|
||||
out[i].v = write_num(out[i].t, out[i].v, myv);
|
||||
out[i].t = 't';
|
||||
}
|
||||
var retval = "";
|
||||
for(i=0; i !== out.length; ++i) if(out[i] != null) retval += out[i].v;
|
||||
return retval;
|
||||
}
|
||||
SSF._eval = eval_fmt;
|
15
packages/ssf/bits/88_cond.js
Normal file
15
packages/ssf/bits/88_cond.js
Normal file
@ -0,0 +1,15 @@
|
||||
var cfregex = /\[[=<>]/;
|
||||
var cfregex2 = /\[(=|>[=]?|<[>=]?)(-?\d+(?:\.\d*)?)\]/;
|
||||
function chkcond(v, rr) {
|
||||
if(rr == null) return false;
|
||||
var thresh = parseFloat(rr[2]);
|
||||
switch(rr[1]) {
|
||||
case "=": if(v == thresh) return true; break;
|
||||
case ">": if(v > thresh) return true; break;
|
||||
case "<": if(v < thresh) return true; break;
|
||||
case "<>": if(v != thresh) return true; break;
|
||||
case ">=": if(v >= thresh) return true; break;
|
||||
case "<=": if(v <= thresh) return true; break;
|
||||
}
|
||||
return false;
|
||||
}
|
44
packages/ssf/bits/90_main.js
Normal file
44
packages/ssf/bits/90_main.js
Normal file
@ -0,0 +1,44 @@
|
||||
function choose_fmt(f/*:string*/, v/*:any*/) {
|
||||
var fmt = split_fmt(f);
|
||||
var l = fmt.length, lat = fmt[l-1].indexOf("@");
|
||||
if(l<4 && lat>-1) --l;
|
||||
if(fmt.length > 4) throw new Error("cannot find right format for |" + fmt.join("|") + "|");
|
||||
if(typeof v !== "number") return [4, fmt.length === 4 || lat>-1?fmt[fmt.length-1]:"@"];
|
||||
switch(fmt.length) {
|
||||
case 1: fmt = lat>-1 ? ["General", "General", "General", fmt[0]] : [fmt[0], fmt[0], fmt[0], "@"]; break;
|
||||
case 2: fmt = lat>-1 ? [fmt[0], fmt[0], fmt[0], fmt[1]] : [fmt[0], fmt[1], fmt[0], "@"]; break;
|
||||
case 3: fmt = lat>-1 ? [fmt[0], fmt[1], fmt[0], fmt[2]] : [fmt[0], fmt[1], fmt[2], "@"]; break;
|
||||
case 4: break;
|
||||
}
|
||||
var ff = v > 0 ? fmt[0] : v < 0 ? fmt[1] : fmt[2];
|
||||
if(fmt[0].indexOf("[") === -1 && fmt[1].indexOf("[") === -1) return [l, ff];
|
||||
if(fmt[0].match(cfregex) != null || fmt[1].match(cfregex) != null) {
|
||||
var m1 = fmt[0].match(cfregex2);
|
||||
var m2 = fmt[1].match(cfregex2);
|
||||
return chkcond(v, m1) ? [l, fmt[0]] : chkcond(v, m2) ? [l, fmt[1]] : [l, fmt[m1 != null && m2 != null ? 2 : 1]];
|
||||
}
|
||||
return [l, ff];
|
||||
}
|
||||
function format(fmt/*:string|number*/,v/*:any*/,o/*:?any*/) {
|
||||
if(o == null) o = {};
|
||||
var sfmt = "";
|
||||
switch(typeof fmt) {
|
||||
case "string":
|
||||
if(fmt == "m/d/yy" && o.dateNF) sfmt = o.dateNF;
|
||||
else sfmt = fmt;
|
||||
break;
|
||||
case "number":
|
||||
if(fmt == 14 && o.dateNF) sfmt = o.dateNF;
|
||||
else sfmt = (o.table != null ? (o.table/*:any*/) : table_fmt)[fmt];
|
||||
if(sfmt == null) sfmt = (o.table && o.table[default_map[fmt]]) || table_fmt[default_map[fmt]];
|
||||
if(sfmt == null) sfmt = default_str[fmt] || "General";
|
||||
break;
|
||||
}
|
||||
if(isgeneral(sfmt,0)) return general_fmt(v, o);
|
||||
if(v instanceof Date) v = datenum_local(v, o.date1904);
|
||||
var f = choose_fmt(sfmt, v);
|
||||
if(isgeneral(f[1])) return general_fmt(v, o);
|
||||
if(v === true) v = "TRUE"; else if(v === false) v = "FALSE";
|
||||
else if(v === "" || v == null) return "";
|
||||
return eval_fmt(f[1], v, o, f[0]);
|
||||
}
|
17
packages/ssf/bits/95_load.js
Normal file
17
packages/ssf/bits/95_load.js
Normal file
@ -0,0 +1,17 @@
|
||||
function load_entry(fmt/*:string*/, idx/*:?number*/)/*:number*/ {
|
||||
if(typeof idx != 'number') {
|
||||
idx = +idx || -1;
|
||||
/*::if(typeof idx != 'number') return 0x188; */
|
||||
for(var i = 0; i < 0x0188; ++i) {
|
||||
/*::if(typeof idx != 'number') return 0x188; */
|
||||
if(table_fmt[i] == undefined) { if(idx < 0) idx = i; continue; }
|
||||
if(table_fmt[i] == fmt) { idx = i; break; }
|
||||
}
|
||||
/*::if(typeof idx != 'number') return 0x188; */
|
||||
if(idx < 0) idx = 0x187;
|
||||
}
|
||||
/*::if(typeof idx != 'number') return 0x188; */
|
||||
table_fmt[idx] = fmt;
|
||||
return idx;
|
||||
}
|
||||
SSF.load = load_entry;
|
8
packages/ssf/bits/98_exports.js
Normal file
8
packages/ssf/bits/98_exports.js
Normal file
@ -0,0 +1,8 @@
|
||||
SSF._table = table_fmt;
|
||||
SSF.get_table = function get_table()/*:SSFTable*/ { return table_fmt; };
|
||||
SSF.load_table = function load_table(tbl/*:SSFTable*/)/*:void*/ {
|
||||
for(var i=0; i!=0x0188; ++i)
|
||||
if(tbl[i] !== undefined) load_entry(tbl[i], i);
|
||||
};
|
||||
SSF.init_table = init_table;
|
||||
SSF.format = format;
|
4
packages/ssf/bits/99_footer.js
Normal file
4
packages/ssf/bits/99_footer.js
Normal file
@ -0,0 +1,4 @@
|
||||
};
|
||||
make_ssf(SSF);
|
||||
/*global module */
|
||||
if(typeof module !== 'undefined' && typeof DO_NOT_EXPORT_SSF === 'undefined') module.exports = SSF;
|
33
packages/ssf/ctest/index.html
Normal file
33
packages/ssf/ctest/index.html
Normal file
@ -0,0 +1,33 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>SSF Test Runner</title>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<link rel="stylesheet" href="mocha.css" />
|
||||
<link rel="icon" type="image/png" href="//oss.sheetjs.com/assets/img/logo.png" />
|
||||
<style>
|
||||
#t { font: 20px/1.5 "Helvetica Neue", Helvetica, Arial, sans-serif; margin: 0px 60px; font-weight: bold; }
|
||||
#tt{ font: 16px/1.5 "Helvetica Neue", Helvetica, Arial, sans-serif; margin: 0px 60px; }
|
||||
th { font: 16px/1.5 "Helvetica Neue", Helvetica, Arial, sans-serif; margin: 0px 60px; font-weight: bold; text-align: left; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h1 id="t">SSF Tests</h1>
|
||||
<div id="mocha"></div>
|
||||
<script src="shim.js"></script>
|
||||
<script src="json2.js"></script>
|
||||
<script src="mocha.js"></script>
|
||||
<script>
|
||||
window.initMochaPhantomJS && window.initMochaPhantomJS();
|
||||
mocha.setup('bdd');
|
||||
</script>
|
||||
<script src="test.js"></script>
|
||||
<script>
|
||||
if(typeof mochaSaucePlease !== "undefined") mochaSaucePlease();
|
||||
else if(window.mochaPhantomJS) mochaPhantomJS.run();
|
||||
else mocha.run();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
489
packages/ssf/ctest/json2.js
Normal file
489
packages/ssf/ctest/json2.js
Normal file
@ -0,0 +1,489 @@
|
||||
/*
|
||||
json2.js
|
||||
2014-02-04
|
||||
|
||||
Public Domain.
|
||||
|
||||
NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
|
||||
|
||||
See http://www.JSON.org/js.html
|
||||
|
||||
|
||||
This code should be minified before deployment.
|
||||
See http://javascript.crockford.com/jsmin.html
|
||||
|
||||
USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO
|
||||
NOT CONTROL.
|
||||
|
||||
|
||||
This file creates a global JSON object containing two methods: stringify
|
||||
and parse.
|
||||
|
||||
JSON.stringify(value, replacer, space)
|
||||
value any JavaScript value, usually an object or array.
|
||||
|
||||
replacer an optional parameter that determines how object
|
||||
values are stringified for objects. It can be a
|
||||
function or an array of strings.
|
||||
|
||||
space an optional parameter that specifies the indentation
|
||||
of nested structures. If it is omitted, the text will
|
||||
be packed without extra whitespace. If it is a number,
|
||||
it will specify the number of spaces to indent at each
|
||||
level. If it is a string (such as '\t' or ' '),
|
||||
it contains the characters used to indent at each level.
|
||||
|
||||
This method produces a JSON text from a JavaScript value.
|
||||
|
||||
When an object value is found, if the object contains a toJSON
|
||||
method, its toJSON method will be called and the result will be
|
||||
stringified. A toJSON method does not serialize: it returns the
|
||||
value represented by the name/value pair that should be serialized,
|
||||
or undefined if nothing should be serialized. The toJSON method
|
||||
will be passed the key associated with the value, and this will be
|
||||
bound to the value
|
||||
|
||||
For example, this would serialize Dates as ISO strings.
|
||||
|
||||
Date.prototype.toJSON = function (key) {
|
||||
function f(n) {
|
||||
// Format integers to have at least two digits.
|
||||
return n < 10 ? '0' + n : n;
|
||||
}
|
||||
|
||||
return this.getUTCFullYear() + '-' +
|
||||
f(this.getUTCMonth() + 1) + '-' +
|
||||
f(this.getUTCDate()) + 'T' +
|
||||
f(this.getUTCHours()) + ':' +
|
||||
f(this.getUTCMinutes()) + ':' +
|
||||
f(this.getUTCSeconds()) + 'Z';
|
||||
};
|
||||
|
||||
You can provide an optional replacer method. It will be passed the
|
||||
key and value of each member, with this bound to the containing
|
||||
object. The value that is returned from your method will be
|
||||
serialized. If your method returns undefined, then the member will
|
||||
be excluded from the serialization.
|
||||
|
||||
If the replacer parameter is an array of strings, then it will be
|
||||
used to select the members to be serialized. It filters the results
|
||||
such that only members with keys listed in the replacer array are
|
||||
stringified.
|
||||
|
||||
Values that do not have JSON representations, such as undefined or
|
||||
functions, will not be serialized. Such values in objects will be
|
||||
dropped; in arrays they will be replaced with null. You can use
|
||||
a replacer function to replace those with JSON values.
|
||||
JSON.stringify(undefined) returns undefined.
|
||||
|
||||
The optional space parameter produces a stringification of the
|
||||
value that is filled with line breaks and indentation to make it
|
||||
easier to read.
|
||||
|
||||
If the space parameter is a non-empty string, then that string will
|
||||
be used for indentation. If the space parameter is a number, then
|
||||
the indentation will be that many spaces.
|
||||
|
||||
Example:
|
||||
|
||||
text = JSON.stringify(['e', {pluribus: 'unum'}]);
|
||||
// text is '["e",{"pluribus":"unum"}]'
|
||||
|
||||
|
||||
text = JSON.stringify(['e', {pluribus: 'unum'}], null, '\t');
|
||||
// text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]'
|
||||
|
||||
text = JSON.stringify([new Date()], function (key, value) {
|
||||
return this[key] instanceof Date ?
|
||||
'Date(' + this[key] + ')' : value;
|
||||
});
|
||||
// text is '["Date(---current time---)"]'
|
||||
|
||||
|
||||
JSON.parse(text, reviver)
|
||||
This method parses a JSON text to produce an object or array.
|
||||
It can throw a SyntaxError exception.
|
||||
|
||||
The optional reviver parameter is a function that can filter and
|
||||
transform the results. It receives each of the keys and values,
|
||||
and its return value is used instead of the original value.
|
||||
If it returns what it received, then the structure is not modified.
|
||||
If it returns undefined then the member is deleted.
|
||||
|
||||
Example:
|
||||
|
||||
// Parse the text. Values that look like ISO date strings will
|
||||
// be converted to Date objects.
|
||||
|
||||
myData = JSON.parse(text, function (key, value) {
|
||||
var a;
|
||||
if (typeof value === 'string') {
|
||||
a =
|
||||
/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
|
||||
if (a) {
|
||||
return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],
|
||||
+a[5], +a[6]));
|
||||
}
|
||||
}
|
||||
return value;
|
||||
});
|
||||
|
||||
myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) {
|
||||
var d;
|
||||
if (typeof value === 'string' &&
|
||||
value.slice(0, 5) === 'Date(' &&
|
||||
value.slice(-1) === ')') {
|
||||
d = new Date(value.slice(5, -1));
|
||||
if (d) {
|
||||
return d;
|
||||
}
|
||||
}
|
||||
return value;
|
||||
});
|
||||
|
||||
|
||||
This is a reference implementation. You are free to copy, modify, or
|
||||
redistribute.
|
||||
*/
|
||||
|
||||
/*jslint evil: true, regexp: true */
|
||||
|
||||
/*members "", "\b", "\t", "\n", "\f", "\r", "\"", JSON, "\\", apply,
|
||||
call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,
|
||||
getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join,
|
||||
lastIndex, length, parse, prototype, push, replace, slice, stringify,
|
||||
test, toJSON, toString, valueOf
|
||||
*/
|
||||
|
||||
|
||||
// Create a JSON object only if one does not already exist. We create the
|
||||
// methods in a closure to avoid creating global variables.
|
||||
|
||||
if (typeof JSON !== 'object') {
|
||||
JSON = {};
|
||||
}
|
||||
|
||||
(function () {
|
||||
'use strict';
|
||||
|
||||
function f(n) {
|
||||
// Format integers to have at least two digits.
|
||||
return n < 10 ? '0' + n : n;
|
||||
}
|
||||
|
||||
if (typeof Date.prototype.toJSON !== 'function') {
|
||||
|
||||
Date.prototype.toJSON = function () {
|
||||
|
||||
return isFinite(this.valueOf())
|
||||
? this.getUTCFullYear() + '-' +
|
||||
f(this.getUTCMonth() + 1) + '-' +
|
||||
f(this.getUTCDate()) + 'T' +
|
||||
f(this.getUTCHours()) + ':' +
|
||||
f(this.getUTCMinutes()) + ':' +
|
||||
f(this.getUTCSeconds()) + 'Z'
|
||||
: null;
|
||||
};
|
||||
|
||||
String.prototype.toJSON =
|
||||
Number.prototype.toJSON =
|
||||
Boolean.prototype.toJSON = function () {
|
||||
return this.valueOf();
|
||||
};
|
||||
}
|
||||
|
||||
var cx,
|
||||
escapable,
|
||||
gap,
|
||||
indent,
|
||||
meta,
|
||||
rep;
|
||||
|
||||
|
||||
function quote(string) {
|
||||
|
||||
// If the string contains no control characters, no quote characters, and no
|
||||
// backslash characters, then we can safely slap some quotes around it.
|
||||
// Otherwise we must also replace the offending characters with safe escape
|
||||
// sequences.
|
||||
|
||||
escapable.lastIndex = 0;
|
||||
return escapable.test(string) ? '"' + string.replace(escapable, function (a) {
|
||||
var c = meta[a];
|
||||
return typeof c === 'string'
|
||||
? c
|
||||
: '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
|
||||
}) + '"' : '"' + string + '"';
|
||||
}
|
||||
|
||||
|
||||
function str(key, holder) {
|
||||
|
||||
// Produce a string from holder[key].
|
||||
|
||||
var i, // The loop counter.
|
||||
k, // The member key.
|
||||
v, // The member value.
|
||||
length,
|
||||
mind = gap,
|
||||
partial,
|
||||
value = holder[key];
|
||||
|
||||
// If the value has a toJSON method, call it to obtain a replacement value.
|
||||
|
||||
if (value && typeof value === 'object' &&
|
||||
typeof value.toJSON === 'function') {
|
||||
value = value.toJSON(key);
|
||||
}
|
||||
|
||||
// If we were called with a replacer function, then call the replacer to
|
||||
// obtain a replacement value.
|
||||
|
||||
if (typeof rep === 'function') {
|
||||
value = rep.call(holder, key, value);
|
||||
}
|
||||
|
||||
// What happens next depends on the value's type.
|
||||
|
||||
switch (typeof value) {
|
||||
case 'string':
|
||||
return quote(value);
|
||||
|
||||
case 'number':
|
||||
|
||||
// JSON numbers must be finite. Encode non-finite numbers as null.
|
||||
|
||||
return isFinite(value) ? String(value) : 'null';
|
||||
|
||||
case 'boolean':
|
||||
case 'null':
|
||||
|
||||
// If the value is a boolean or null, convert it to a string. Note:
|
||||
// typeof null does not produce 'null'. The case is included here in
|
||||
// the remote chance that this gets fixed someday.
|
||||
|
||||
return String(value);
|
||||
|
||||
// If the type is 'object', we might be dealing with an object or an array or
|
||||
// null.
|
||||
|
||||
case 'object':
|
||||
|
||||
// Due to a specification blunder in ECMAScript, typeof null is 'object',
|
||||
// so watch out for that case.
|
||||
|
||||
if (!value) {
|
||||
return 'null';
|
||||
}
|
||||
|
||||
// Make an array to hold the partial results of stringifying this object value.
|
||||
|
||||
gap += indent;
|
||||
partial = [];
|
||||
|
||||
// Is the value an array?
|
||||
|
||||
if (Object.prototype.toString.apply(value) === '[object Array]') {
|
||||
|
||||
// The value is an array. Stringify every element. Use null as a placeholder
|
||||
// for non-JSON values.
|
||||
|
||||
length = value.length;
|
||||
for (i = 0; i < length; i += 1) {
|
||||
partial[i] = str(i, value) || 'null';
|
||||
}
|
||||
|
||||
// Join all of the elements together, separated with commas, and wrap them in
|
||||
// brackets.
|
||||
|
||||
v = partial.length === 0
|
||||
? '[]'
|
||||
: gap
|
||||
? '[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']'
|
||||
: '[' + partial.join(',') + ']';
|
||||
gap = mind;
|
||||
return v;
|
||||
}
|
||||
|
||||
// If the replacer is an array, use it to select the members to be stringified.
|
||||
|
||||
if (rep && typeof rep === 'object') {
|
||||
length = rep.length;
|
||||
for (i = 0; i < length; i += 1) {
|
||||
if (typeof rep[i] === 'string') {
|
||||
k = rep[i];
|
||||
v = str(k, value);
|
||||
if (v) {
|
||||
partial.push(quote(k) + (gap ? ': ' : ':') + v);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
|
||||
// Otherwise, iterate through all of the keys in the object.
|
||||
|
||||
for (k in value) {
|
||||
if (Object.prototype.hasOwnProperty.call(value, k)) {
|
||||
v = str(k, value);
|
||||
if (v) {
|
||||
partial.push(quote(k) + (gap ? ': ' : ':') + v);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Join all of the member texts together, separated with commas,
|
||||
// and wrap them in braces.
|
||||
|
||||
v = partial.length === 0
|
||||
? '{}'
|
||||
: gap
|
||||
? '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}'
|
||||
: '{' + partial.join(',') + '}';
|
||||
gap = mind;
|
||||
return v;
|
||||
}
|
||||
}
|
||||
|
||||
// If the JSON object does not yet have a stringify method, give it one.
|
||||
|
||||
if (typeof JSON.stringify !== 'function') {
|
||||
escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
|
||||
meta = { // table of character substitutions
|
||||
'\b': '\\b',
|
||||
'\t': '\\t',
|
||||
'\n': '\\n',
|
||||
'\f': '\\f',
|
||||
'\r': '\\r',
|
||||
'"' : '\\"',
|
||||
'\\': '\\\\'
|
||||
};
|
||||
JSON.stringify = function (value, replacer, space) {
|
||||
|
||||
// The stringify method takes a value and an optional replacer, and an optional
|
||||
// space parameter, and returns a JSON text. The replacer can be a function
|
||||
// that can replace values, or an array of strings that will select the keys.
|
||||
// A default replacer method can be provided. Use of the space parameter can
|
||||
// produce text that is more easily readable.
|
||||
|
||||
var i;
|
||||
gap = '';
|
||||
indent = '';
|
||||
|
||||
// If the space parameter is a number, make an indent string containing that
|
||||
// many spaces.
|
||||
|
||||
if (typeof space === 'number') {
|
||||
for (i = 0; i < space; i += 1) {
|
||||
indent += ' ';
|
||||
}
|
||||
|
||||
// If the space parameter is a string, it will be used as the indent string.
|
||||
|
||||
} else if (typeof space === 'string') {
|
||||
indent = space;
|
||||
}
|
||||
|
||||
// If there is a replacer, it must be a function or an array.
|
||||
// Otherwise, throw an error.
|
||||
|
||||
rep = replacer;
|
||||
if (replacer && typeof replacer !== 'function' &&
|
||||
(typeof replacer !== 'object' ||
|
||||
typeof replacer.length !== 'number')) {
|
||||
throw new Error('JSON.stringify');
|
||||
}
|
||||
|
||||
// Make a fake root object containing our value under the key of ''.
|
||||
// Return the result of stringifying the value.
|
||||
|
||||
return str('', {'': value});
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
// If the JSON object does not yet have a parse method, give it one.
|
||||
|
||||
if (typeof JSON.parse !== 'function') {
|
||||
cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
|
||||
JSON.parse = function (text, reviver) {
|
||||
|
||||
// The parse method takes a text and an optional reviver function, and returns
|
||||
// a JavaScript value if the text is a valid JSON text.
|
||||
|
||||
var j;
|
||||
|
||||
function walk(holder, key) {
|
||||
|
||||
// The walk method is used to recursively walk the resulting structure so
|
||||
// that modifications can be made.
|
||||
|
||||
var k, v, value = holder[key];
|
||||
if (value && typeof value === 'object') {
|
||||
for (k in value) {
|
||||
if (Object.prototype.hasOwnProperty.call(value, k)) {
|
||||
v = walk(value, k);
|
||||
if (v !== undefined) {
|
||||
value[k] = v;
|
||||
} else {
|
||||
delete value[k];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return reviver.call(holder, key, value);
|
||||
}
|
||||
|
||||
|
||||
// Parsing happens in four stages. In the first stage, we replace certain
|
||||
// Unicode characters with escape sequences. JavaScript handles many characters
|
||||
// incorrectly, either silently deleting them, or treating them as line endings.
|
||||
|
||||
text = String(text);
|
||||
cx.lastIndex = 0;
|
||||
if (cx.test(text)) {
|
||||
text = text.replace(cx, function (a) {
|
||||
return '\\u' +
|
||||
('0000' + a.charCodeAt(0).toString(16)).slice(-4);
|
||||
});
|
||||
}
|
||||
|
||||
// In the second stage, we run the text against regular expressions that look
|
||||
// for non-JSON patterns. We are especially concerned with '()' and 'new'
|
||||
// because they can cause invocation, and '=' because it can cause mutation.
|
||||
// But just to be safe, we want to reject all unexpected forms.
|
||||
|
||||
// We split the second stage into 4 regexp operations in order to work around
|
||||
// crippling inefficiencies in IE's and Safari's regexp engines. First we
|
||||
// replace the JSON backslash pairs with '@' (a non-JSON character). Second, we
|
||||
// replace all simple value tokens with ']' characters. Third, we delete all
|
||||
// open brackets that follow a colon or comma or that begin the text. Finally,
|
||||
// we look to see that the remaining characters are only whitespace or ']' or
|
||||
// ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval.
|
||||
|
||||
if (/^[\],:{}\s]*$/
|
||||
.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@')
|
||||
.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']')
|
||||
.replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {
|
||||
|
||||
// In the third stage we use the eval function to compile the text into a
|
||||
// JavaScript structure. The '{' operator is subject to a syntactic ambiguity
|
||||
// in JavaScript: it can begin a block or an object literal. We wrap the text
|
||||
// in parens to eliminate the ambiguity.
|
||||
|
||||
j = eval('(' + text + ')');
|
||||
|
||||
// In the optional fourth stage, we recursively walk the new structure, passing
|
||||
// each name/value pair to a reviver function for possible transformation.
|
||||
|
||||
return typeof reviver === 'function'
|
||||
? walk({'': j}, '')
|
||||
: j;
|
||||
}
|
||||
|
||||
// If the text is not JSON parseable, then a SyntaxError is thrown.
|
||||
|
||||
throw new SyntaxError('JSON.parse');
|
||||
};
|
||||
}
|
||||
}());
|
260
packages/ssf/ctest/mocha.css
Normal file
260
packages/ssf/ctest/mocha.css
Normal file
@ -0,0 +1,260 @@
|
||||
@charset "utf-8";
|
||||
|
||||
body {
|
||||
margin:0;
|
||||
}
|
||||
|
||||
#mocha {
|
||||
font: 20px/1.5 "Helvetica Neue", Helvetica, Arial, sans-serif;
|
||||
margin: 60px 50px;
|
||||
}
|
||||
|
||||
#mocha ul, #mocha li {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
#mocha ul {
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
#mocha h1, #mocha h2 {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
#mocha h1 {
|
||||
margin-top: 15px;
|
||||
font-size: 1em;
|
||||
font-weight: 200;
|
||||
}
|
||||
|
||||
#mocha h1 a {
|
||||
text-decoration: none;
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
#mocha h1 a:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
#mocha .suite .suite h1 {
|
||||
margin-top: 0;
|
||||
font-size: .8em;
|
||||
}
|
||||
|
||||
#mocha .hidden {
|
||||
display: none;
|
||||
}
|
||||
|
||||
#mocha h2 {
|
||||
font-size: 12px;
|
||||
font-weight: normal;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
#mocha .suite {
|
||||
margin-left: 15px;
|
||||
}
|
||||
|
||||
#mocha .test {
|
||||
margin-left: 15px;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
#mocha .test.pending:hover h2::after {
|
||||
content: '(pending)';
|
||||
font-family: arial, sans-serif;
|
||||
}
|
||||
|
||||
#mocha .test.pass.medium .duration {
|
||||
background: #C09853;
|
||||
}
|
||||
|
||||
#mocha .test.pass.slow .duration {
|
||||
background: #B94A48;
|
||||
}
|
||||
|
||||
#mocha .test.pass::before {
|
||||
content: '✓';
|
||||
font-size: 12px;
|
||||
display: block;
|
||||
float: left;
|
||||
margin-right: 5px;
|
||||
color: #00d6b2;
|
||||
}
|
||||
|
||||
#mocha .test.pass .duration {
|
||||
font-size: 9px;
|
||||
margin-left: 5px;
|
||||
padding: 2px 5px;
|
||||
color: white;
|
||||
-webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.2);
|
||||
-moz-box-shadow: inset 0 1px 1px rgba(0,0,0,.2);
|
||||
box-shadow: inset 0 1px 1px rgba(0,0,0,.2);
|
||||
-webkit-border-radius: 5px;
|
||||
-moz-border-radius: 5px;
|
||||
-ms-border-radius: 5px;
|
||||
-o-border-radius: 5px;
|
||||
border-radius: 5px;
|
||||
}
|
||||
|
||||
#mocha .test.pass.fast .duration {
|
||||
display: none;
|
||||
}
|
||||
|
||||
#mocha .test.pending {
|
||||
color: #0b97c4;
|
||||
}
|
||||
|
||||
#mocha .test.pending::before {
|
||||
content: '◦';
|
||||
color: #0b97c4;
|
||||
}
|
||||
|
||||
#mocha .test.fail {
|
||||
color: #c00;
|
||||
}
|
||||
|
||||
#mocha .test.fail pre {
|
||||
color: black;
|
||||
}
|
||||
|
||||
#mocha .test.fail::before {
|
||||
content: '✖';
|
||||
font-size: 12px;
|
||||
display: block;
|
||||
float: left;
|
||||
margin-right: 5px;
|
||||
color: #c00;
|
||||
}
|
||||
|
||||
#mocha .test pre.error {
|
||||
color: #c00;
|
||||
max-height: 300px;
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
#mocha .test pre {
|
||||
display: block;
|
||||
float: left;
|
||||
clear: left;
|
||||
font: 12px/1.5 monaco, monospace;
|
||||
margin: 5px;
|
||||
padding: 15px;
|
||||
border: 1px solid #eee;
|
||||
border-bottom-color: #ddd;
|
||||
-webkit-border-radius: 3px;
|
||||
-webkit-box-shadow: 0 1px 3px #eee;
|
||||
-moz-border-radius: 3px;
|
||||
-moz-box-shadow: 0 1px 3px #eee;
|
||||
border-radius: 3px;
|
||||
}
|
||||
|
||||
#mocha .test h2 {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
#mocha .test a.replay {
|
||||
position: absolute;
|
||||
top: 3px;
|
||||
right: 0;
|
||||
text-decoration: none;
|
||||
vertical-align: middle;
|
||||
display: block;
|
||||
width: 15px;
|
||||
height: 15px;
|
||||
line-height: 15px;
|
||||
text-align: center;
|
||||
background: #eee;
|
||||
font-size: 15px;
|
||||
-moz-border-radius: 15px;
|
||||
border-radius: 15px;
|
||||
-webkit-transition: opacity 200ms;
|
||||
-moz-transition: opacity 200ms;
|
||||
transition: opacity 200ms;
|
||||
opacity: 0.3;
|
||||
color: #888;
|
||||
}
|
||||
|
||||
#mocha .test:hover a.replay {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
#mocha-report.pass .test.fail {
|
||||
display: none;
|
||||
}
|
||||
|
||||
#mocha-report.fail .test.pass {
|
||||
display: none;
|
||||
}
|
||||
|
||||
#mocha-report.pending .test.pass,
|
||||
#mocha-report.pending .test.fail {
|
||||
display: none;
|
||||
}
|
||||
#mocha-report.pending .test.pass.pending {
|
||||
display: block;
|
||||
}
|
||||
|
||||
#mocha-error {
|
||||
color: #c00;
|
||||
font-size: 1.5em;
|
||||
font-weight: 100;
|
||||
letter-spacing: 1px;
|
||||
}
|
||||
|
||||
#mocha-stats {
|
||||
position: fixed;
|
||||
top: 15px;
|
||||
right: 10px;
|
||||
font-size: 12px;
|
||||
margin: 0;
|
||||
color: #888;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
#mocha-stats .progress {
|
||||
float: right;
|
||||
padding-top: 0;
|
||||
}
|
||||
|
||||
#mocha-stats em {
|
||||
color: black;
|
||||
}
|
||||
|
||||
#mocha-stats a {
|
||||
text-decoration: none;
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
#mocha-stats a:hover {
|
||||
border-bottom: 1px solid #eee;
|
||||
}
|
||||
|
||||
#mocha-stats li {
|
||||
display: inline-block;
|
||||
margin: 0 5px;
|
||||
list-style: none;
|
||||
padding-top: 11px;
|
||||
}
|
||||
|
||||
#mocha-stats canvas {
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
}
|
||||
|
||||
#mocha code .comment { color: #ddd }
|
||||
#mocha code .init { color: #2F6FAD }
|
||||
#mocha code .string { color: #5890AD }
|
||||
#mocha code .keyword { color: #8A6343 }
|
||||
#mocha code .number { color: #2F6FAD }
|
||||
|
||||
@media screen and (max-device-width: 480px) {
|
||||
#mocha {
|
||||
margin: 60px 0px;
|
||||
}
|
||||
|
||||
#mocha #stats {
|
||||
position: absolute;
|
||||
}
|
||||
}
|
5554
packages/ssf/ctest/mocha.js
Normal file
5554
packages/ssf/ctest/mocha.js
Normal file
File diff suppressed because it is too large
Load Diff
330
packages/ssf/ctest/shim.js
Normal file
330
packages/ssf/ctest/shim.js
Normal file
@ -0,0 +1,330 @@
|
||||
// From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys
|
||||
if (!Object.keys) {
|
||||
Object.keys = (function () {
|
||||
var hasOwnProperty = Object.prototype.hasOwnProperty,
|
||||
hasDontEnumBug = !({toString: null}).propertyIsEnumerable('toString'),
|
||||
dontEnums = [
|
||||
'toString',
|
||||
'toLocaleString',
|
||||
'valueOf',
|
||||
'hasOwnProperty',
|
||||
'isPrototypeOf',
|
||||
'propertyIsEnumerable',
|
||||
'constructor'
|
||||
],
|
||||
dontEnumsLength = dontEnums.length;
|
||||
|
||||
return function (obj) {
|
||||
if (typeof obj !== 'object' && typeof obj !== 'function' || obj === null) throw new TypeError('Object.keys called on non-object');
|
||||
|
||||
var result = [];
|
||||
|
||||
for (var prop in obj) {
|
||||
if (hasOwnProperty.call(obj, prop)) result.push(prop);
|
||||
}
|
||||
|
||||
if (hasDontEnumBug) {
|
||||
for (var i=0; i < dontEnumsLength; i++) {
|
||||
if (hasOwnProperty.call(obj, dontEnums[i])) result.push(dontEnums[i]);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
};
|
||||
})();
|
||||
}
|
||||
|
||||
// From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter
|
||||
if (!Array.prototype.filter)
|
||||
{
|
||||
Array.prototype.filter = function(fun /*, thisp */)
|
||||
{
|
||||
"use strict";
|
||||
|
||||
if (this == null)
|
||||
throw new TypeError();
|
||||
|
||||
var t = Object(this);
|
||||
var len = t.length >>> 0;
|
||||
if (typeof fun != "function")
|
||||
throw new TypeError();
|
||||
|
||||
var res = [];
|
||||
var thisp = arguments[1];
|
||||
for (var i = 0; i < len; i++)
|
||||
{
|
||||
if (i in t)
|
||||
{
|
||||
var val = t[i]; // in case fun mutates this
|
||||
if (fun.call(thisp, val, i, t))
|
||||
res.push(val);
|
||||
}
|
||||
}
|
||||
|
||||
return res;
|
||||
};
|
||||
}
|
||||
|
||||
// From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/Trim
|
||||
if (!String.prototype.trim) {
|
||||
String.prototype.trim = function () {
|
||||
return this.replace(/^\s+|\s+$/g, '');
|
||||
};
|
||||
}
|
||||
|
||||
// From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach
|
||||
if (!Array.prototype.forEach)
|
||||
{
|
||||
Array.prototype.forEach = function(fun /*, thisArg */)
|
||||
{
|
||||
"use strict";
|
||||
|
||||
if (this === void 0 || this === null)
|
||||
throw new TypeError();
|
||||
|
||||
var t = Object(this);
|
||||
var len = t.length >>> 0;
|
||||
if (typeof fun !== "function")
|
||||
throw new TypeError();
|
||||
|
||||
var thisArg = arguments.length >= 2 ? arguments[1] : void 0;
|
||||
for (var i = 0; i < len; i++)
|
||||
{
|
||||
if (i in t)
|
||||
fun.call(thisArg, t[i], i, t);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
// Production steps of ECMA-262, Edition 5, 15.4.4.19
|
||||
// Reference: http://es5.github.com/#x15.4.4.19
|
||||
if (!Array.prototype.map) {
|
||||
Array.prototype.map = function(callback, thisArg) {
|
||||
|
||||
var T, A, k;
|
||||
|
||||
if (this == null) {
|
||||
throw new TypeError(" this is null or not defined");
|
||||
}
|
||||
|
||||
// 1. Let O be the result of calling ToObject passing the |this| value as the argument.
|
||||
var O = Object(this);
|
||||
|
||||
// 2. Let lenValue be the result of calling the Get internal method of O with the argument "length".
|
||||
// 3. Let len be ToUint32(lenValue).
|
||||
var len = O.length >>> 0;
|
||||
|
||||
// 4. If IsCallable(callback) is false, throw a TypeError exception.
|
||||
// See: http://es5.github.com/#x9.11
|
||||
if (typeof callback !== "function") {
|
||||
throw new TypeError(callback + " is not a function");
|
||||
}
|
||||
|
||||
// 5. If thisArg was supplied, let T be thisArg; else let T be undefined.
|
||||
if (thisArg) {
|
||||
T = thisArg;
|
||||
}
|
||||
|
||||
// 6. Let A be a new array created as if by the expression new Array(len) where Array is
|
||||
// the standard built-in constructor with that name and len is the value of len.
|
||||
A = new Array(len);
|
||||
|
||||
// 7. Let k be 0
|
||||
k = 0;
|
||||
|
||||
// 8. Repeat, while k < len
|
||||
while(k < len) {
|
||||
|
||||
var kValue, mappedValue;
|
||||
|
||||
// a. Let Pk be ToString(k).
|
||||
// This is implicit for LHS operands of the in operator
|
||||
// b. Let kPresent be the result of calling the HasProperty internal method of O with argument Pk.
|
||||
// This step can be combined with c
|
||||
// c. If kPresent is true, then
|
||||
if (k in O) {
|
||||
|
||||
// i. Let kValue be the result of calling the Get internal method of O with argument Pk.
|
||||
kValue = O[ k ];
|
||||
|
||||
// ii. Let mappedValue be the result of calling the Call internal method of callback
|
||||
// with T as the this value and argument list containing kValue, k, and O.
|
||||
mappedValue = callback.call(T, kValue, k, O);
|
||||
|
||||
// iii. Call the DefineOwnProperty internal method of A with arguments
|
||||
// Pk, Property Descriptor {Value: mappedValue, : true, Enumerable: true, Configurable: true},
|
||||
// and false.
|
||||
|
||||
// In browsers that support Object.defineProperty, use the following:
|
||||
// Object.defineProperty(A, Pk, { value: mappedValue, writable: true, enumerable: true, configurable: true });
|
||||
|
||||
// For best browser support, use the following:
|
||||
A[ k ] = mappedValue;
|
||||
}
|
||||
// d. Increase k by 1.
|
||||
k++;
|
||||
}
|
||||
|
||||
// 9. return A
|
||||
return A;
|
||||
};
|
||||
}
|
||||
|
||||
// From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf
|
||||
if (!Array.prototype.indexOf) {
|
||||
Array.prototype.indexOf = function (searchElement, fromIndex) {
|
||||
if ( this === undefined || this === null ) {
|
||||
throw new TypeError( '"this" is null or not defined' );
|
||||
}
|
||||
|
||||
var length = this.length >>> 0; // Hack to convert object.length to a UInt32
|
||||
|
||||
fromIndex = +fromIndex || 0;
|
||||
|
||||
if (Math.abs(fromIndex) === Infinity) {
|
||||
fromIndex = 0;
|
||||
}
|
||||
|
||||
if (fromIndex < 0) {
|
||||
fromIndex += length;
|
||||
if (fromIndex < 0) {
|
||||
fromIndex = 0;
|
||||
}
|
||||
}
|
||||
|
||||
for (;fromIndex < length; fromIndex++) {
|
||||
if (this[fromIndex] === searchElement) {
|
||||
return fromIndex;
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
};
|
||||
}
|
||||
// Based on https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray
|
||||
|
||||
if (! Array.isArray) {
|
||||
Array.isArray = function(obj) {
|
||||
return Object.prototype.toString.call(obj) === "[object Array]";
|
||||
};
|
||||
}
|
||||
|
||||
// https://github.com/ttaubert/node-arraybuffer-slice
|
||||
// (c) 2013 Tim Taubert <tim@timtaubert.de>
|
||||
// arraybuffer-slice may be freely distributed under the MIT license.
|
||||
|
||||
"use strict";
|
||||
|
||||
if (typeof ArrayBuffer !== 'undefined' && !ArrayBuffer.prototype.slice) {
|
||||
ArrayBuffer.prototype.slice = function (begin, end) {
|
||||
begin = (begin|0) || 0;
|
||||
var num = this.byteLength;
|
||||
end = end === (void 0) ? num : (end|0);
|
||||
|
||||
// Handle negative values.
|
||||
if (begin < 0) begin += num;
|
||||
if (end < 0) end += num;
|
||||
|
||||
if (num === 0 || begin >= num || begin >= end) {
|
||||
return new ArrayBuffer(0);
|
||||
}
|
||||
|
||||
var length = Math.min(num - begin, end - begin);
|
||||
var target = new ArrayBuffer(length);
|
||||
var targetArray = new Uint8Array(target);
|
||||
targetArray.set(new Uint8Array(this, begin, length));
|
||||
return target;
|
||||
};
|
||||
}
|
||||
|
||||
// https://github.com/davidchambers/Base64.js
|
||||
// (C) 2015 David Chambers
|
||||
// Base64.js may be freely distributed under the Apache 2.0 License.
|
||||
|
||||
;(function () {
|
||||
|
||||
var object = typeof exports != 'undefined' ? exports : typeof self != 'undefined' ? self : eval("this");
|
||||
var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
|
||||
|
||||
function InvalidCharacterError(message) {
|
||||
this.message = message;
|
||||
}
|
||||
InvalidCharacterError.prototype = new Error;
|
||||
InvalidCharacterError.prototype.name = 'InvalidCharacterError';
|
||||
|
||||
// encoder
|
||||
// [https://gist.github.com/999166] by [https://github.com/nignag]
|
||||
object.btoa || (
|
||||
object.btoa = function (input) {
|
||||
var str = String(input);
|
||||
for (
|
||||
// initialize result and counter
|
||||
var block, charCode, idx = 0, map = chars, output = '';
|
||||
// if the next str index does not exist:
|
||||
// change the mapping table to "="
|
||||
// check if d has no fractional digits
|
||||
str.charAt(idx | 0) || (map = '=', idx % 1);
|
||||
// "8 - idx % 1 * 8" generates the sequence 2, 4, 6, 8
|
||||
output += map.charAt(63 & block >> 8 - idx % 1 * 8)
|
||||
) {
|
||||
charCode = str.charCodeAt(idx += 3/4);
|
||||
if (charCode > 0xFF) {
|
||||
throw new InvalidCharacterError("'btoa' failed: The string to be encoded contains characters outside of the Latin1 range.");
|
||||
}
|
||||
block = block << 8 | charCode;
|
||||
}
|
||||
return output;
|
||||
});
|
||||
|
||||
// decoder
|
||||
// [https://gist.github.com/1020396] by [https://github.com/atk]
|
||||
object.atob || (
|
||||
object.atob = function (input) {
|
||||
var str = String(input).replace(new RegExp("=+$"), '');
|
||||
if (str.length % 4 == 1) {
|
||||
throw new InvalidCharacterError("'atob' failed: The string to be decoded is not correctly encoded.");
|
||||
}
|
||||
for (
|
||||
// initialize result and counters
|
||||
var bc = 0, bs, buffer, idx = 0, output = '';
|
||||
// get next character
|
||||
buffer = str.charAt(idx++);
|
||||
// character found in table? initialize bit storage and add its ascii value;
|
||||
~buffer && (bs = bc % 4 ? bs * 64 + buffer : buffer,
|
||||
// and if not first of each 4 characters,
|
||||
// convert the first 8 bits to one ascii character
|
||||
bc++ % 4) ? output += String.fromCharCode(255 & bs >> (-2 * bc & 6)) : 0
|
||||
) {
|
||||
// try to find character in table (0-63, not found => -1)
|
||||
buffer = chars.indexOf(buffer);
|
||||
}
|
||||
return output;
|
||||
});
|
||||
|
||||
}());
|
||||
|
||||
|
||||
// From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString
|
||||
if (!Date.prototype.toISOString) {
|
||||
(function() {
|
||||
|
||||
function pad(number) {
|
||||
if (number < 10) {
|
||||
return '0' + number;
|
||||
}
|
||||
return number;
|
||||
}
|
||||
|
||||
Date.prototype.toISOString = function() {
|
||||
return this.getUTCFullYear() +
|
||||
'-' + pad(this.getUTCMonth() + 1) +
|
||||
'-' + pad(this.getUTCDate()) +
|
||||
'T' + pad(this.getUTCHours()) +
|
||||
':' + pad(this.getUTCMinutes()) +
|
||||
':' + pad(this.getUTCSeconds()) +
|
||||
'.' + (this.getUTCMilliseconds() / 1000).toFixed(3).slice(2, 5) +
|
||||
'Z';
|
||||
};
|
||||
|
||||
}());
|
||||
}
|
||||
|
70
packages/ssf/index.html
Normal file
70
packages/ssf/index.html
Normal file
@ -0,0 +1,70 @@
|
||||
<!DOCTYPE html>
|
||||
<!-- ssf.js (C) 2013-present SheetJS http://sheetjs.com -->
|
||||
<!-- vim: set ts=2: -->
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
||||
<title>SSF Live Demo</title>
|
||||
<style>
|
||||
a { text-decoration: none }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<pre>
|
||||
<b><a href="http://sheetjs.com">SSF (Spreadsheet Number Format) Live Demo</a></b>
|
||||
|
||||
<a href="https://github.com/SheetJS/ssf">Source Code Repo</a>
|
||||
<a href="https://github.com/SheetJS/ssf/issues">Issues? Something look weird? Click here and report an issue</a>
|
||||
</pre>
|
||||
<table>
|
||||
<tr><td><b>Format code:</b></td><td><input type="text" id="fmt" value="General"></td></tr>
|
||||
<tr><td><b>Value:</b></td><td><input type="text" id="val" value="3.1415926535"></td></tr>
|
||||
<tr><td colspan="2"> </td></tr>
|
||||
<tr><td><b>Formatted Number:</b></td><td><pre id="num"></pre></td></tr>
|
||||
<tr><td><b>Formatted Text</b></td><td><pre id="txt"></pre></td></tr>
|
||||
</table>
|
||||
<script src="ssf.js"></script>
|
||||
<script>
|
||||
/*jshint browser:true */
|
||||
/*eslint-env browser */
|
||||
/*eslint no-use-before-define:0 */
|
||||
/*global SSF */
|
||||
var F = document.getElementById('fmt');
|
||||
var V = document.getElementById('val');
|
||||
var N = document.getElementById('num');
|
||||
var T = document.getElementById('txt');
|
||||
|
||||
function update() {
|
||||
try {
|
||||
N.innerHTML = SSF.format(F.value, Number(V.value));
|
||||
} catch(e) { N.innerHTML = e; }
|
||||
try {
|
||||
T.innerHTML = SSF.format(F.value, V.value);
|
||||
} catch(e) { T.innerHTML = e; }
|
||||
}
|
||||
|
||||
/* Bind to relevant events */
|
||||
if(F.addEventListener) {
|
||||
F.addEventListener('keyup', update);
|
||||
V.addEventListener('keyup', update);
|
||||
} else if(F.attachEvent) {
|
||||
F.attachEvent('onkeyup', update);
|
||||
V.attachEvent('onkeyup', update);
|
||||
} else {
|
||||
F.oninput = update;
|
||||
V.oninput = update;
|
||||
}
|
||||
|
||||
update();
|
||||
var _gaq = _gaq || [];
|
||||
_gaq.push(['_setAccount', 'UA-36810333-1']);
|
||||
_gaq.push(['_trackPageview']);
|
||||
|
||||
(function() {
|
||||
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
|
||||
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
|
||||
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
|
||||
})();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
31
packages/ssf/misc/flow.js
Normal file
31
packages/ssf/misc/flow.js
Normal file
@ -0,0 +1,31 @@
|
||||
/*# vim: set ts=2: */
|
||||
/*::
|
||||
|
||||
type SSFTable = {[key:number|string]:string};
|
||||
type SSFDate = {
|
||||
D:number; T:number;
|
||||
y:number; m:number; d:number; q:number;
|
||||
H:number; M:number; S:number; u:number;
|
||||
};
|
||||
|
||||
type SSFModule = {
|
||||
format:(fmt:string|number, v:any, o:any)=>string;
|
||||
|
||||
is_date:(fmt:string)=>boolean;
|
||||
parse_date_code:(v:number,opts:any)=>?SSFDate;
|
||||
|
||||
load:(fmt:string, idx:?number)=>number;
|
||||
get_table:()=>SSFTable;
|
||||
load_table:(table:any)=>void;
|
||||
_table:SSFTable;
|
||||
init_table:any;
|
||||
|
||||
_general_int:(v:number)=>string;
|
||||
_general_num:(v:number)=>string;
|
||||
_general:(v:number, o:?any)=>string;
|
||||
_eval:any;
|
||||
_split:any;
|
||||
version:string;
|
||||
};
|
||||
|
||||
*/
|
7
packages/ssf/misc/flowdeps.js
Normal file
7
packages/ssf/misc/flowdeps.js
Normal file
@ -0,0 +1,7 @@
|
||||
/*# vim: set ts=2: */
|
||||
/*::
|
||||
|
||||
declare module './' { declare module.exports:SSFModule; };
|
||||
declare module '../' { declare module.exports:SSFModule; };
|
||||
declare module 'ssf' { declare module.exports:SSFModule; };
|
||||
*/
|
42
packages/ssf/misc/help.sh
Executable file
42
packages/ssf/misc/help.sh
Executable file
@ -0,0 +1,42 @@
|
||||
#!/bin/bash
|
||||
# make_help.sh -- process listing of targets and special items in Makefile
|
||||
# Copyright (C) 2016-present SheetJS
|
||||
#
|
||||
# usage in makefile: pipe the output of the following command:
|
||||
# @grep -hE '(^[a-zA-Z_-][ a-zA-Z_-]*:.*?|^#[#*])' $(MAKEFILE_LIST)
|
||||
#
|
||||
# lines starting with "## " are treated as subtitles
|
||||
# lines starting with "#* " are treated as plaintext comments
|
||||
# multiple targets with "## " after the ":" are rendered as separate targets
|
||||
# if the presumed default target is labeled, it will be assigned a unique color
|
||||
|
||||
awk '
|
||||
BEGIN{recipes=0;}
|
||||
!/#[#*] .*$/ {next;}
|
||||
{multi=0; isrecipe=0;}
|
||||
/^[^#]*:/ {isrecipe=1; ++recipes;}
|
||||
/^[^ :]* .*:/ {multi=1}
|
||||
multi==0 && isrecipe>0 { if(recipes > 1) print; else print $0, "[default]"; next}
|
||||
isrecipe == 0 {print; next}
|
||||
multi>0 {
|
||||
k=split($0, msg, "##"); m=split($0, a, ":"); n=split(a[1], b, " ");
|
||||
for(i=1; i<=n; ++i) print b[i] ":", "##" msg[2], (recipes==1 && i==1 ? "[default]" : "")
|
||||
}
|
||||
END {}
|
||||
' | if [[ -t 1 ]]; then
|
||||
awk '
|
||||
BEGIN {FS = ":.*?## "}
|
||||
{color=36}
|
||||
/\[default\]/ {color=35}
|
||||
NF==1 && /^##/ {color=34}
|
||||
NF==1 && /^#\*/ {color=20; $1 = substr($1, 4)}
|
||||
{printf "\033[" color "m%-20s\033[0m %s\n", $1, $2;}
|
||||
END{}' -
|
||||
else
|
||||
awk '
|
||||
BEGIN {FS = ":.*?## "}
|
||||
/^#\* / {$1 = substr($1, 4)}
|
||||
{printf "%-20s %s\n", $1, $2;}
|
||||
END{}' -
|
||||
fi
|
||||
|
11
packages/ssf/misc/node_version.sh
Executable file
11
packages/ssf/misc/node_version.sh
Executable file
@ -0,0 +1,11 @@
|
||||
#! /usr/bin/env bash
|
||||
|
||||
# This script will check the current version of node and install another version
|
||||
# of npm if node is version 0.8
|
||||
|
||||
version=$(node --version)
|
||||
|
||||
if [[ $version =~ v0\.8\. ]]
|
||||
then
|
||||
npm install -g npm@4.3.0
|
||||
fi
|
77
packages/ssf/misc/perf.js
Normal file
77
packages/ssf/misc/perf.js
Normal file
@ -0,0 +1,77 @@
|
||||
/* vim: set ts=2: */
|
||||
/*jshint loopfunc:true */
|
||||
var SSF = require('../');
|
||||
var fs = require('fs')//, assert = require('assert');
|
||||
var data = JSON.parse(fs.readFileSync('./test/oddities.json','utf8'));
|
||||
var dates = fs.readFileSync('./test/dates.tsv','utf8').split("\n");
|
||||
var date2 = fs.readFileSync('./test/cal.tsv', 'utf8').split("\n");
|
||||
var times = fs.readFileSync('./test/times.tsv','utf8').split("\n");
|
||||
function doit(data) {
|
||||
/* Prevent Optimization */
|
||||
/* Prevent Optimization */
|
||||
/* Prevent Optimization */
|
||||
/* Prevent Optimization */
|
||||
/* Prevent Optimization */
|
||||
/* Prevent Optimization */
|
||||
/* Prevent Optimization */
|
||||
/* Prevent Optimization */
|
||||
/* Prevent Optimization */
|
||||
/* Prevent Optimization */
|
||||
/* Prevent Optimization */
|
||||
/* Prevent Optimization */
|
||||
/* Prevent Optimization */
|
||||
/* Prevent Optimization */
|
||||
/* Prevent Optimization */
|
||||
/* Prevent Optimization */
|
||||
/* Prevent Optimization */
|
||||
/* Prevent Optimization */
|
||||
/* Prevent Optimization */
|
||||
/* Prevent Optimization */
|
||||
/* Prevent Optimization */
|
||||
var headers = data[0].split("\t");
|
||||
for(var k = 1; k <= data.length; ++k) {
|
||||
if(data[k] == null) return;
|
||||
var d = data[k].replace(/#{255}/g,"").split("\t");
|
||||
for(var w = 1; w < headers.length; ++w) {
|
||||
var expected = d[w], actual = SSF.format(headers[w], parseFloat(d[0]), {});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function testit() {
|
||||
/* Prevent Optimization */
|
||||
/* Prevent Optimization */
|
||||
/* Prevent Optimization */
|
||||
/* Prevent Optimization */
|
||||
/* Prevent Optimization */
|
||||
/* Prevent Optimization */
|
||||
/* Prevent Optimization */
|
||||
/* Prevent Optimization */
|
||||
/* Prevent Optimization */
|
||||
/* Prevent Optimization */
|
||||
/* Prevent Optimization */
|
||||
/* Prevent Optimization */
|
||||
/* Prevent Optimization */
|
||||
/* Prevent Optimization */
|
||||
/* Prevent Optimization */
|
||||
/* Prevent Optimization */
|
||||
/* Prevent Optimization */
|
||||
/* Prevent Optimization */
|
||||
/* Prevent Optimization */
|
||||
/* Prevent Optimization */
|
||||
doit(times.slice(0,4000));
|
||||
doit(dates.slice(0,4000));
|
||||
for(var i = 0; i != 1000; ++i) {
|
||||
for(var k = 0; k != data.length; ++k) {
|
||||
var d = data[k];
|
||||
for(var j=1;j<d.length;++j) {
|
||||
if(d[j].length == 2) {
|
||||
var expected = d[j][1], actual = SSF.format(d[0], d[j][0], {});
|
||||
//if(actual != expected) console.log(d[j]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
testit();
|
13
packages/ssf/misc/perf.sh
Executable file
13
packages/ssf/misc/perf.sh
Executable file
@ -0,0 +1,13 @@
|
||||
#!/bin/bash
|
||||
ARGS="--trace_opt --trace_deopt --trace_inlining --code_comments"
|
||||
#ARGS="--trace_opt --trace_deopt --code_comments"
|
||||
SCPT=misc/perf.js
|
||||
|
||||
echo 1
|
||||
make && jshint --show-non-errors ssf.js && make lint &&
|
||||
MINTEST=1 mocha -b && time node $SCPT && {
|
||||
node $ARGS $SCPT > perf.log
|
||||
node --prof $SCPT
|
||||
echo 1; time node $SCPT >/dev/null
|
||||
echo 1; time node $SCPT >/dev/null
|
||||
} && grep disabled perf.log
|
1
packages/ssf/misc/photoshop.jsx
Normal file
1
packages/ssf/misc/photoshop.jsx
Normal file
@ -0,0 +1 @@
|
||||
#include "ssf.flow.js";
var fmt = 10;
var data = 123.456789;
alert(SSF.format(fmt, data));
|
14
packages/ssf/misc/spin.sh
Executable file
14
packages/ssf/misc/spin.sh
Executable file
@ -0,0 +1,14 @@
|
||||
#!/bin/bash
|
||||
# spin.sh -- show a spinner (for coverage test)
|
||||
# Copyright (C) 2014-present SheetJS
|
||||
|
||||
wpid=$1
|
||||
delay=1
|
||||
str="|/-\\"
|
||||
while [ $(ps -a|awk '$1=='$wpid' {print $1}') ]; do
|
||||
t=${str#?}
|
||||
printf " [%c]" "$str"
|
||||
str=$t${str%"$t"}
|
||||
sleep $delay
|
||||
printf "\b\b\b\b"
|
||||
done
|
58
packages/ssf/package.json
Normal file
58
packages/ssf/package.json
Normal file
@ -0,0 +1,58 @@
|
||||
{
|
||||
"name": "ssf",
|
||||
"version": "0.11.2",
|
||||
"author": "sheetjs",
|
||||
"description": "Format data using ECMA-376 spreadsheet Format Codes",
|
||||
"keywords": [
|
||||
"format",
|
||||
"sprintf",
|
||||
"spreadsheet"
|
||||
],
|
||||
"main": "ssf.js",
|
||||
"types": "types",
|
||||
"dependencies": {
|
||||
"frac":"~1.1.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@sheetjs/uglify-js":"~2.7.3",
|
||||
"@types/node":"^8.0.7",
|
||||
"blanket": "~1.2.3",
|
||||
"dtslint": "^0.1.2",
|
||||
"mocha": "~2.5.3",
|
||||
"typescript": "2.2.0"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git://github.com/SheetJS/sheetjs.git",
|
||||
"directory": "packages/ssf"
|
||||
},
|
||||
"scripts": {
|
||||
"test": "make test",
|
||||
"build": "make",
|
||||
"lint": "make fullint",
|
||||
"dtslint": "dtslint types"
|
||||
},
|
||||
"config": {
|
||||
"blanket": {
|
||||
"pattern": "ssf.js"
|
||||
}
|
||||
},
|
||||
"alex": {
|
||||
"allow": [
|
||||
"special",
|
||||
"simple",
|
||||
"just",
|
||||
"crash",
|
||||
"wtf",
|
||||
"holes"
|
||||
]
|
||||
},
|
||||
"homepage": "http://sheetjs.com/",
|
||||
"bugs": {
|
||||
"url": "https://github.com/SheetJS/sheetjs/issues"
|
||||
},
|
||||
"license": "Apache-2.0",
|
||||
"engines": {
|
||||
"node": ">=0.8"
|
||||
}
|
||||
}
|
980
packages/ssf/ssf.flow.js
Normal file
980
packages/ssf/ssf.flow.js
Normal file
@ -0,0 +1,980 @@
|
||||
/* ssf.js (C) 2013-present SheetJS -- http://sheetjs.com */
|
||||
/* vim: set ts=2: */
|
||||
/*jshint -W041 */
|
||||
/*:: declare var DO_NOT_EXPORT_SSF: any; */
|
||||
var SSF/*:SSFModule*/ = ({}/*:any*/);
|
||||
var make_ssf = function make_ssf(SSF/*:SSFModule*/){
|
||||
SSF.version = '0.11.2';
|
||||
function _strrev(x/*:string*/)/*:string*/ { var o = "", i = x.length-1; while(i>=0) o += x.charAt(i--); return o; }
|
||||
function fill(c/*:string*/,l/*:number*/)/*:string*/ { var o = ""; while(o.length < l) o+=c; return o; }
|
||||
function pad0(v/*:any*/,d/*:number*/)/*:string*/{var t=""+v; return t.length>=d?t:fill('0',d-t.length)+t;}
|
||||
function pad_(v/*:any*/,d/*:number*/)/*:string*/{var t=""+v;return t.length>=d?t:fill(' ',d-t.length)+t;}
|
||||
function rpad_(v/*:any*/,d/*:number*/)/*:string*/{var t=""+v; return t.length>=d?t:t+fill(' ',d-t.length);}
|
||||
function pad0r1(v/*:any*/,d/*:number*/)/*:string*/{var t=""+Math.round(v); return t.length>=d?t:fill('0',d-t.length)+t;}
|
||||
function pad0r2(v/*:any*/,d/*:number*/)/*:string*/{var t=""+v; return t.length>=d?t:fill('0',d-t.length)+t;}
|
||||
var p2_32 = Math.pow(2,32);
|
||||
function pad0r(v/*:any*/,d/*:number*/)/*:string*/{if(v>p2_32||v<-p2_32) return pad0r1(v,d); var i = Math.round(v); return pad0r2(i,d); }
|
||||
function isgeneral(s/*:string*/, i/*:?number*/)/*:boolean*/ { i = i || 0; return s.length >= 7 + i && (s.charCodeAt(i)|32) === 103 && (s.charCodeAt(i+1)|32) === 101 && (s.charCodeAt(i+2)|32) === 110 && (s.charCodeAt(i+3)|32) === 101 && (s.charCodeAt(i+4)|32) === 114 && (s.charCodeAt(i+5)|32) === 97 && (s.charCodeAt(i+6)|32) === 108; }
|
||||
/*::
|
||||
type SSF_write_num = {(type:string, fmt:string, val:number):string};
|
||||
*/
|
||||
var days/*:Array<Array<string> >*/ = [
|
||||
['Sun', 'Sunday'],
|
||||
['Mon', 'Monday'],
|
||||
['Tue', 'Tuesday'],
|
||||
['Wed', 'Wednesday'],
|
||||
['Thu', 'Thursday'],
|
||||
['Fri', 'Friday'],
|
||||
['Sat', 'Saturday']
|
||||
];
|
||||
var months/*:Array<Array<string> >*/ = [
|
||||
['J', 'Jan', 'January'],
|
||||
['F', 'Feb', 'February'],
|
||||
['M', 'Mar', 'March'],
|
||||
['A', 'Apr', 'April'],
|
||||
['M', 'May', 'May'],
|
||||
['J', 'Jun', 'June'],
|
||||
['J', 'Jul', 'July'],
|
||||
['A', 'Aug', 'August'],
|
||||
['S', 'Sep', 'September'],
|
||||
['O', 'Oct', 'October'],
|
||||
['N', 'Nov', 'November'],
|
||||
['D', 'Dec', 'December']
|
||||
];
|
||||
function init_table(t/*:any*/) {
|
||||
t[0]= 'General';
|
||||
t[1]= '0';
|
||||
t[2]= '0.00';
|
||||
t[3]= '#,##0';
|
||||
t[4]= '#,##0.00';
|
||||
t[9]= '0%';
|
||||
t[10]= '0.00%';
|
||||
t[11]= '0.00E+00';
|
||||
t[12]= '# ?/?';
|
||||
t[13]= '# ??/??';
|
||||
t[14]= 'm/d/yy';
|
||||
t[15]= 'd-mmm-yy';
|
||||
t[16]= 'd-mmm';
|
||||
t[17]= 'mmm-yy';
|
||||
t[18]= 'h:mm AM/PM';
|
||||
t[19]= 'h:mm:ss AM/PM';
|
||||
t[20]= 'h:mm';
|
||||
t[21]= 'h:mm:ss';
|
||||
t[22]= 'm/d/yy h:mm';
|
||||
t[37]= '#,##0 ;(#,##0)';
|
||||
t[38]= '#,##0 ;[Red](#,##0)';
|
||||
t[39]= '#,##0.00;(#,##0.00)';
|
||||
t[40]= '#,##0.00;[Red](#,##0.00)';
|
||||
t[45]= 'mm:ss';
|
||||
t[46]= '[h]:mm:ss';
|
||||
t[47]= 'mmss.0';
|
||||
t[48]= '##0.0E+0';
|
||||
t[49]= '@';
|
||||
t[56]= '"上午/下午 "hh"時"mm"分"ss"秒 "';
|
||||
}
|
||||
|
||||
var table_fmt = {};
|
||||
init_table(table_fmt);
|
||||
/* Defaults determined by systematically testing in Excel 2019 */
|
||||
|
||||
/* These formats appear to default to other formats in the table */
|
||||
var default_map/*:Array<number>*/ = [];
|
||||
var defi = 0;
|
||||
|
||||
// 5 -> 37 ... 8 -> 40
|
||||
for(defi = 5; defi <= 8; ++defi) default_map[defi] = 32 + defi;
|
||||
|
||||
// 23 -> 0 ... 26 -> 0
|
||||
for(defi = 23; defi <= 26; ++defi) default_map[defi] = 0;
|
||||
|
||||
// 27 -> 14 ... 31 -> 14
|
||||
for(defi = 27; defi <= 31; ++defi) default_map[defi] = 14;
|
||||
// 50 -> 14 ... 58 -> 14
|
||||
for(defi = 50; defi <= 58; ++defi) default_map[defi] = 14;
|
||||
|
||||
// 59 -> 1 ... 62 -> 4
|
||||
for(defi = 59; defi <= 62; ++defi) default_map[defi] = defi - 58;
|
||||
// 67 -> 9 ... 68 -> 10
|
||||
for(defi = 67; defi <= 68; ++defi) default_map[defi] = defi - 58;
|
||||
// 72 -> 14 ... 75 -> 17
|
||||
for(defi = 72; defi <= 75; ++defi) default_map[defi] = defi - 58;
|
||||
|
||||
// 69 -> 12 ... 71 -> 14
|
||||
for(defi = 67; defi <= 68; ++defi) default_map[defi] = defi - 57;
|
||||
|
||||
// 76 -> 20 ... 78 -> 22
|
||||
for(defi = 76; defi <= 78; ++defi) default_map[defi] = defi - 56;
|
||||
|
||||
// 79 -> 45 ... 81 -> 47
|
||||
for(defi = 79; defi <= 81; ++defi) default_map[defi] = defi - 34;
|
||||
|
||||
// 82 -> 0 ... 65536 -> 0 (omitted)
|
||||
|
||||
/* These formats technically refer to Accounting formats with no equivalent */
|
||||
var default_str/*:Array<string>*/ = [];
|
||||
|
||||
// 5 -- Currency, 0 decimal, black negative
|
||||
default_str[5] = default_str[63] = '"$"#,##0_);\\("$"#,##0\\)';
|
||||
// 6 -- Currency, 0 decimal, red negative
|
||||
default_str[6] = default_str[64] = '"$"#,##0_);[Red]\\("$"#,##0\\)';
|
||||
// 7 -- Currency, 2 decimal, black negative
|
||||
default_str[7] = default_str[65] = '"$"#,##0.00_);\\("$"#,##0.00\\)';
|
||||
// 8 -- Currency, 2 decimal, red negative
|
||||
default_str[8] = default_str[66] = '"$"#,##0.00_);[Red]\\("$"#,##0.00\\)';
|
||||
|
||||
// 41 -- Accounting, 0 decimal, No Symbol
|
||||
default_str[41] = '_(* #,##0_);_(* \\(#,##0\\);_(* "-"_);_(@_)';
|
||||
// 42 -- Accounting, 0 decimal, $ Symbol
|
||||
default_str[42] = '_("$"* #,##0_);_("$"* \\(#,##0\\);_("$"* "-"_);_(@_)';
|
||||
// 43 -- Accounting, 2 decimal, No Symbol
|
||||
default_str[43] = '_(* #,##0.00_);_(* \\(#,##0.00\\);_(* "-"??_);_(@_)';
|
||||
// 44 -- Accounting, 2 decimal, $ Symbol
|
||||
default_str[44] = '_("$"* #,##0.00_);_("$"* \\(#,##0.00\\);_("$"* "-"??_);_(@_)';
|
||||
function frac(x/*:number*/, D/*:number*/, mixed/*:?boolean*/)/*:Array<number>*/ {
|
||||
var sgn = x < 0 ? -1 : 1;
|
||||
var B = x * sgn;
|
||||
var P_2 = 0, P_1 = 1, P = 0;
|
||||
var Q_2 = 1, Q_1 = 0, Q = 0;
|
||||
var A = Math.floor(B);
|
||||
while(Q_1 < D) {
|
||||
A = Math.floor(B);
|
||||
P = A * P_1 + P_2;
|
||||
Q = A * Q_1 + Q_2;
|
||||
if((B - A) < 0.00000005) break;
|
||||
B = 1 / (B - A);
|
||||
P_2 = P_1; P_1 = P;
|
||||
Q_2 = Q_1; Q_1 = Q;
|
||||
}
|
||||
if(Q > D) { if(Q_1 > D) { Q = Q_2; P = P_2; } else { Q = Q_1; P = P_1; } }
|
||||
if(!mixed) return [0, sgn * P, Q];
|
||||
var q = Math.floor(sgn * P/Q);
|
||||
return [q, sgn*P - q*Q, Q];
|
||||
}
|
||||
function parse_date_code(v/*:number*/,opts/*:?any*/,b2/*:?boolean*/) {
|
||||
if(v > 2958465 || v < 0) return null;
|
||||
var date = (v|0), time = Math.floor(86400 * (v - date)), dow=0;
|
||||
var dout=[];
|
||||
var out={D:date, T:time, u:86400*(v-date)-time,y:0,m:0,d:0,H:0,M:0,S:0,q:0};
|
||||
if(Math.abs(out.u) < 1e-6) out.u = 0;
|
||||
if(opts && opts.date1904) date += 1462;
|
||||
if(out.u > 0.9999) {
|
||||
out.u = 0;
|
||||
if(++time == 86400) { out.T = time = 0; ++date; ++out.D; }
|
||||
}
|
||||
if(date === 60) {dout = b2 ? [1317,10,29] : [1900,2,29]; dow=3;}
|
||||
else if(date === 0) {dout = b2 ? [1317,8,29] : [1900,1,0]; dow=6;}
|
||||
else {
|
||||
if(date > 60) --date;
|
||||
/* 1 = Jan 1 1900 in Gregorian */
|
||||
var d = new Date(1900, 0, 1);
|
||||
d.setDate(d.getDate() + date - 1);
|
||||
dout = [d.getFullYear(), d.getMonth()+1,d.getDate()];
|
||||
dow = d.getDay();
|
||||
if(date < 60) dow = (dow + 6) % 7;
|
||||
if(b2) dow = fix_hijri(d, dout);
|
||||
}
|
||||
out.y = dout[0]; out.m = dout[1]; out.d = dout[2];
|
||||
out.S = time % 60; time = Math.floor(time / 60);
|
||||
out.M = time % 60; time = Math.floor(time / 60);
|
||||
out.H = time;
|
||||
out.q = dow;
|
||||
return out;
|
||||
}
|
||||
SSF.parse_date_code = parse_date_code;
|
||||
var basedate = new Date(1899, 11, 31, 0, 0, 0);
|
||||
var dnthresh = basedate.getTime();
|
||||
var base1904 = new Date(1900, 2, 1, 0, 0, 0);
|
||||
function datenum_local(v/*:Date*/, date1904/*:?boolean*/)/*:number*/ {
|
||||
var epoch = v.getTime();
|
||||
if(date1904) epoch -= 1461*24*60*60*1000;
|
||||
else if(v >= base1904) epoch += 24*60*60*1000;
|
||||
return (epoch - (dnthresh + (v.getTimezoneOffset() - basedate.getTimezoneOffset()) * 60000)) / (24 * 60 * 60 * 1000);
|
||||
}
|
||||
/* The longest 32-bit integer text is "-4294967296", exactly 11 chars */
|
||||
function general_fmt_int(v/*:number*/)/*:string*/ { return v.toString(10); }
|
||||
SSF._general_int = general_fmt_int;
|
||||
|
||||
/* ECMA-376 18.8.30 numFmt*/
|
||||
/* Note: `toPrecision` uses standard form when prec > E and E >= -6 */
|
||||
var general_fmt_num = (function make_general_fmt_num() {
|
||||
var trailing_zeroes_and_decimal = /(?:\.0*|(\.\d*[1-9])0+)$/;
|
||||
function strip_decimal(o/*:string*/)/*:string*/ {
|
||||
return (o.indexOf(".") == -1) ? o : o.replace(trailing_zeroes_and_decimal, "$1");
|
||||
}
|
||||
|
||||
/* General Exponential always shows 2 digits exp and trims the mantissa */
|
||||
var mantissa_zeroes_and_decimal = /(?:\.0*|(\.\d*[1-9])0+)[Ee]/;
|
||||
var exp_with_single_digit = /(E[+-])(\d)$/;
|
||||
function normalize_exp(o/*:string*/)/*:string*/ {
|
||||
if(o.indexOf("E") == -1) return o;
|
||||
return o.replace(mantissa_zeroes_and_decimal,"$1E").replace(exp_with_single_digit,"$10$2");
|
||||
}
|
||||
|
||||
/* exponent >= -9 and <= 9 */
|
||||
function small_exp(v/*:number*/)/*:string*/ {
|
||||
var w = (v<0?12:11);
|
||||
var o = strip_decimal(v.toFixed(12)); if(o.length <= w) return o;
|
||||
o = v.toPrecision(10); if(o.length <= w) return o;
|
||||
return v.toExponential(5);
|
||||
}
|
||||
|
||||
/* exponent >= 11 or <= -10 likely exponential */
|
||||
function large_exp(v/*:number*/)/*:string*/ {
|
||||
var o = strip_decimal(v.toFixed(11));
|
||||
return (o.length > (v<0?12:11) || o === "0" || o === "-0") ? v.toPrecision(6) : o;
|
||||
}
|
||||
|
||||
function general_fmt_num_base(v/*:number*/)/*:string*/ {
|
||||
var V = Math.floor(Math.log(Math.abs(v))*Math.LOG10E), o;
|
||||
|
||||
if(V >= -4 && V <= -1) o = v.toPrecision(10+V);
|
||||
else if(Math.abs(V) <= 9) o = small_exp(v);
|
||||
else if(V === 10) o = v.toFixed(10).substr(0,12);
|
||||
else o = large_exp(v);
|
||||
|
||||
return strip_decimal(normalize_exp(o.toUpperCase()));
|
||||
}
|
||||
|
||||
return general_fmt_num_base;
|
||||
})();
|
||||
SSF._general_num = general_fmt_num;
|
||||
|
||||
/*
|
||||
"General" rules:
|
||||
- text is passed through ("@")
|
||||
- booleans are rendered as TRUE/FALSE
|
||||
- "up to 11 characters" displayed for numbers
|
||||
- Default date format (code 14) used for Dates
|
||||
|
||||
TODO: technically the display depends on the width of the cell
|
||||
*/
|
||||
function general_fmt(v/*:any*/, opts/*:any*/) {
|
||||
switch(typeof v) {
|
||||
case 'string': return v;
|
||||
case 'boolean': return v ? "TRUE" : "FALSE";
|
||||
case 'number': return (v|0) === v ? v.toString(10) : general_fmt_num(v);
|
||||
case 'undefined': return "";
|
||||
case 'object':
|
||||
if(v == null) return "";
|
||||
if(v instanceof Date) return format(14, datenum_local(v, opts && opts.date1904), opts);
|
||||
}
|
||||
throw new Error("unsupported value in General format: " + v);
|
||||
}
|
||||
SSF._general = general_fmt;
|
||||
function fix_hijri(date/*:Date*/, o/*:[number, number, number]*/) {
|
||||
/* TODO: properly adjust y/m/d and */
|
||||
o[0] -= 581;
|
||||
var dow = date.getDay();
|
||||
if(date < 60) dow = (dow + 6) % 7;
|
||||
return dow;
|
||||
}
|
||||
var THAI_DIGITS = "\u0E50\u0E51\u0E52\u0E53\u0E54\u0E55\u0E56\u0E57\u0E58\u0E59".split("");
|
||||
/*jshint -W086 */
|
||||
function write_date(type/*:number*/, fmt/*:string*/, val, ss0/*:?number*/)/*:string*/ {
|
||||
var o="", ss=0, tt=0, y = val.y, out, outl = 0;
|
||||
switch(type) {
|
||||
case 98: /* 'b' buddhist year */
|
||||
y = val.y + 543;
|
||||
/* falls through */
|
||||
case 121: /* 'y' year */
|
||||
switch(fmt.length) {
|
||||
case 1: case 2: out = y % 100; outl = 2; break;
|
||||
default: out = y % 10000; outl = 4; break;
|
||||
} break;
|
||||
case 109: /* 'm' month */
|
||||
switch(fmt.length) {
|
||||
case 1: case 2: out = val.m; outl = fmt.length; break;
|
||||
case 3: return months[val.m-1][1];
|
||||
case 5: return months[val.m-1][0];
|
||||
default: return months[val.m-1][2];
|
||||
} break;
|
||||
case 100: /* 'd' day */
|
||||
switch(fmt.length) {
|
||||
case 1: case 2: out = val.d; outl = fmt.length; break;
|
||||
case 3: return days[val.q][0];
|
||||
default: return days[val.q][1];
|
||||
} break;
|
||||
case 104: /* 'h' 12-hour */
|
||||
switch(fmt.length) {
|
||||
case 1: case 2: out = 1+(val.H+11)%12; outl = fmt.length; break;
|
||||
default: throw 'bad hour format: ' + fmt;
|
||||
} break;
|
||||
case 72: /* 'H' 24-hour */
|
||||
switch(fmt.length) {
|
||||
case 1: case 2: out = val.H; outl = fmt.length; break;
|
||||
default: throw 'bad hour format: ' + fmt;
|
||||
} break;
|
||||
case 77: /* 'M' minutes */
|
||||
switch(fmt.length) {
|
||||
case 1: case 2: out = val.M; outl = fmt.length; break;
|
||||
default: throw 'bad minute format: ' + fmt;
|
||||
} break;
|
||||
case 115: /* 's' seconds */
|
||||
if(fmt != 's' && fmt != 'ss' && fmt != '.0' && fmt != '.00' && fmt != '.000') throw 'bad second format: ' + fmt;
|
||||
if(val.u === 0 && (fmt == "s" || fmt == "ss")) return pad0(val.S, fmt.length);
|
||||
/*::if(!ss0) ss0 = 0; */
|
||||
if(ss0 >= 2) tt = ss0 === 3 ? 1000 : 100;
|
||||
else tt = ss0 === 1 ? 10 : 1;
|
||||
ss = Math.round((tt)*(val.S + val.u));
|
||||
if(ss >= 60*tt) ss = 0;
|
||||
if(fmt === 's') return ss === 0 ? "0" : ""+ss/tt;
|
||||
o = pad0(ss,2 + ss0);
|
||||
if(fmt === 'ss') return o.substr(0,2);
|
||||
return "." + o.substr(2,fmt.length-1);
|
||||
case 90: /* 'Z' absolute time */
|
||||
switch(fmt) {
|
||||
case '[h]': case '[hh]': out = val.D*24+val.H; break;
|
||||
case '[m]': case '[mm]': out = (val.D*24+val.H)*60+val.M; break;
|
||||
case '[s]': case '[ss]': out = ((val.D*24+val.H)*60+val.M)*60+Math.round(val.S+val.u); break;
|
||||
default: throw 'bad abstime format: ' + fmt;
|
||||
} outl = fmt.length === 3 ? 1 : 2; break;
|
||||
case 101: /* 'e' era */
|
||||
out = y; outl = 1; break;
|
||||
}
|
||||
var outstr = outl > 0 ? pad0(out, outl) : "";
|
||||
return outstr;
|
||||
}
|
||||
/*jshint +W086 */
|
||||
function commaify(s/*:string*/)/*:string*/ {
|
||||
var w = 3;
|
||||
if(s.length <= w) return s;
|
||||
var j = (s.length % w), o = s.substr(0,j);
|
||||
for(; j!=s.length; j+=w) o+=(o.length > 0 ? "," : "") + s.substr(j,w);
|
||||
return o;
|
||||
}
|
||||
var write_num/*:SSF_write_num*/ = (function make_write_num(){
|
||||
var pct1 = /%/g;
|
||||
function write_num_pct(type/*:string*/, fmt/*:string*/, val/*:number*/)/*:string*/{
|
||||
var sfmt = fmt.replace(pct1,""), mul = fmt.length - sfmt.length;
|
||||
return write_num(type, sfmt, val * Math.pow(10,2*mul)) + fill("%",mul);
|
||||
}
|
||||
function write_num_cm(type/*:string*/, fmt/*:string*/, val/*:number*/)/*:string*/{
|
||||
var idx = fmt.length - 1;
|
||||
while(fmt.charCodeAt(idx-1) === 44) --idx;
|
||||
return write_num(type, fmt.substr(0,idx), val / Math.pow(10,3*(fmt.length-idx)));
|
||||
}
|
||||
function write_num_exp(fmt/*:string*/, val/*:number*/)/*:string*/{
|
||||
var o/*:string*/;
|
||||
var idx = fmt.indexOf("E") - fmt.indexOf(".") - 1;
|
||||
if(fmt.match(/^#+0.0E\+0$/)) {
|
||||
if(val == 0) return "0.0E+0";
|
||||
else if(val < 0) return "-" + write_num_exp(fmt, -val);
|
||||
var period = fmt.indexOf("."); if(period === -1) period=fmt.indexOf('E');
|
||||
var ee = Math.floor(Math.log(val)*Math.LOG10E)%period;
|
||||
if(ee < 0) ee += period;
|
||||
o = (val/Math.pow(10,ee)).toPrecision(idx+1+(period+ee)%period);
|
||||
if(o.indexOf("e") === -1) {
|
||||
var fakee = Math.floor(Math.log(val)*Math.LOG10E);
|
||||
if(o.indexOf(".") === -1) o = o.charAt(0) + "." + o.substr(1) + "E+" + (fakee - o.length+ee);
|
||||
else o += "E+" + (fakee - ee);
|
||||
while(o.substr(0,2) === "0.") {
|
||||
o = o.charAt(0) + o.substr(2,period) + "." + o.substr(2+period);
|
||||
o = o.replace(/^0+([1-9])/,"$1").replace(/^0+\./,"0.");
|
||||
}
|
||||
o = o.replace(/\+-/,"-");
|
||||
}
|
||||
o = o.replace(/^([+-]?)(\d*)\.(\d*)[Ee]/,function($$,$1,$2,$3) { return $1 + $2 + $3.substr(0,(period+ee)%period) + "." + $3.substr(ee) + "E"; });
|
||||
} else o = val.toExponential(idx);
|
||||
if(fmt.match(/E\+00$/) && o.match(/e[+-]\d$/)) o = o.substr(0,o.length-1) + "0" + o.charAt(o.length-1);
|
||||
if(fmt.match(/E\-/) && o.match(/e\+/)) o = o.replace(/e\+/,"e");
|
||||
return o.replace("e","E");
|
||||
}
|
||||
var frac1 = /# (\?+)( ?)\/( ?)(\d+)/;
|
||||
function write_num_f1(r/*:Array<string>*/, aval/*:number*/, sign/*:string*/)/*:string*/ {
|
||||
var den = parseInt(r[4],10), rr = Math.round(aval * den), base = Math.floor(rr/den);
|
||||
var myn = (rr - base*den), myd = den;
|
||||
return sign + (base === 0 ? "" : ""+base) + " " + (myn === 0 ? fill(" ", r[1].length + 1 + r[4].length) : pad_(myn,r[1].length) + r[2] + "/" + r[3] + pad0(myd,r[4].length));
|
||||
}
|
||||
function write_num_f2(r/*:Array<string>*/, aval/*:number*/, sign/*:string*/)/*:string*/ {
|
||||
return sign + (aval === 0 ? "" : ""+aval) + fill(" ", r[1].length + 2 + r[4].length);
|
||||
}
|
||||
var dec1 = /^#*0*\.([0#]+)/;
|
||||
var closeparen = /\).*[0#]/;
|
||||
var phone = /\(###\) ###\\?-####/;
|
||||
function hashq(str/*:string*/)/*:string*/ {
|
||||
var o = "", cc;
|
||||
for(var i = 0; i != str.length; ++i) switch((cc=str.charCodeAt(i))) {
|
||||
case 35: break;
|
||||
case 63: o+= " "; break;
|
||||
case 48: o+= "0"; break;
|
||||
default: o+= String.fromCharCode(cc);
|
||||
}
|
||||
return o;
|
||||
}
|
||||
function rnd(val/*:number*/, d/*:number*/)/*:string*/ { var dd = Math.pow(10,d); return ""+(Math.round(val * dd)/dd); }
|
||||
function dec(val/*:number*/, d/*:number*/)/*:number*/ {
|
||||
var _frac = val - Math.floor(val), dd = Math.pow(10,d);
|
||||
if (d < ('' + Math.round(_frac * dd)).length) return 0;
|
||||
return Math.round(_frac * dd);
|
||||
}
|
||||
function carry(val/*:number*/, d/*:number*/)/*:number*/ {
|
||||
if (d < ('' + Math.round((val-Math.floor(val))*Math.pow(10,d))).length) {
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
function flr(val/*:number*/)/*:string*/ {
|
||||
if(val < 2147483647 && val > -2147483648) return ""+(val >= 0 ? (val|0) : (val-1|0));
|
||||
return ""+Math.floor(val);
|
||||
}
|
||||
function write_num_flt(type/*:string*/, fmt/*:string*/, val/*:number*/)/*:string*/ {
|
||||
if(type.charCodeAt(0) === 40 && !fmt.match(closeparen)) {
|
||||
var ffmt = fmt.replace(/\( */,"").replace(/ \)/,"").replace(/\)/,"");
|
||||
if(val >= 0) return write_num_flt('n', ffmt, val);
|
||||
return '(' + write_num_flt('n', ffmt, -val) + ')';
|
||||
}
|
||||
if(fmt.charCodeAt(fmt.length - 1) === 44) return write_num_cm(type, fmt, val);
|
||||
if(fmt.indexOf('%') !== -1) return write_num_pct(type, fmt, val);
|
||||
if(fmt.indexOf('E') !== -1) return write_num_exp(fmt, val);
|
||||
if(fmt.charCodeAt(0) === 36) return "$"+write_num_flt(type,fmt.substr(fmt.charAt(1)==' '?2:1),val);
|
||||
var o;
|
||||
var r/*:?Array<string>*/, ri, ff, aval = Math.abs(val), sign = val < 0 ? "-" : "";
|
||||
if(fmt.match(/^00+$/)) return sign + pad0r(aval,fmt.length);
|
||||
if(fmt.match(/^[#?]+$/)) {
|
||||
o = pad0r(val,0); if(o === "0") o = "";
|
||||
return o.length > fmt.length ? o : hashq(fmt.substr(0,fmt.length-o.length)) + o;
|
||||
}
|
||||
if((r = fmt.match(frac1))) return write_num_f1(r, aval, sign);
|
||||
if(fmt.match(/^#+0+$/)) return sign + pad0r(aval,fmt.length - fmt.indexOf("0"));
|
||||
if((r = fmt.match(dec1))) {
|
||||
o = rnd(val, r[1].length).replace(/^([^\.]+)$/,"$1."+hashq(r[1])).replace(/\.$/,"."+hashq(r[1])).replace(/\.(\d*)$/,function($$, $1) { return "." + $1 + fill("0", hashq(/*::(*/r/*::||[""])*/[1]).length-$1.length); });
|
||||
return fmt.indexOf("0.") !== -1 ? o : o.replace(/^0\./,".");
|
||||
}
|
||||
fmt = fmt.replace(/^#+([0.])/, "$1");
|
||||
if((r = fmt.match(/^(0*)\.(#*)$/))) {
|
||||
return sign + rnd(aval, r[2].length).replace(/\.(\d*[1-9])0*$/,".$1").replace(/^(-?\d*)$/,"$1.").replace(/^0\./,r[1].length?"0.":".");
|
||||
}
|
||||
if((r = fmt.match(/^#{1,3},##0(\.?)$/))) return sign + commaify(pad0r(aval,0));
|
||||
if((r = fmt.match(/^#,##0\.([#0]*0)$/))) {
|
||||
return val < 0 ? "-" + write_num_flt(type, fmt, -val) : commaify(""+(Math.floor(val) + carry(val, r[1].length))) + "." + pad0(dec(val, r[1].length),r[1].length);
|
||||
}
|
||||
if((r = fmt.match(/^#,#*,#0/))) return write_num_flt(type,fmt.replace(/^#,#*,/,""),val);
|
||||
if((r = fmt.match(/^([0#]+)(\\?-([0#]+))+$/))) {
|
||||
o = _strrev(write_num_flt(type, fmt.replace(/[\\-]/g,""), val));
|
||||
ri = 0;
|
||||
return _strrev(_strrev(fmt.replace(/\\/g,"")).replace(/[0#]/g,function(x){return ri<o.length?o.charAt(ri++):x==='0'?'0':"";}));
|
||||
}
|
||||
if(fmt.match(phone)) {
|
||||
o = write_num_flt(type, "##########", val);
|
||||
return "(" + o.substr(0,3) + ") " + o.substr(3, 3) + "-" + o.substr(6);
|
||||
}
|
||||
var oa = "";
|
||||
if((r = fmt.match(/^([#0?]+)( ?)\/( ?)([#0?]+)/))) {
|
||||
ri = Math.min(/*::String(*/r[4]/*::)*/.length,7);
|
||||
ff = frac(aval, Math.pow(10,ri)-1, false);
|
||||
o = "" + sign;
|
||||
oa = write_num("n", /*::String(*/r[1]/*::)*/, ff[1]);
|
||||
if(oa.charAt(oa.length-1) == " ") oa = oa.substr(0,oa.length-1) + "0";
|
||||
o += oa + /*::String(*/r[2]/*::)*/ + "/" + /*::String(*/r[3]/*::)*/;
|
||||
oa = rpad_(ff[2],ri);
|
||||
if(oa.length < r[4].length) oa = hashq(r[4].substr(r[4].length-oa.length)) + oa;
|
||||
o += oa;
|
||||
return o;
|
||||
}
|
||||
if((r = fmt.match(/^# ([#0?]+)( ?)\/( ?)([#0?]+)/))) {
|
||||
ri = Math.min(Math.max(r[1].length, r[4].length),7);
|
||||
ff = frac(aval, Math.pow(10,ri)-1, true);
|
||||
return sign + (ff[0]||(ff[1] ? "" : "0")) + " " + (ff[1] ? pad_(ff[1],ri) + r[2] + "/" + r[3] + rpad_(ff[2],ri): fill(" ", 2*ri+1 + r[2].length + r[3].length));
|
||||
}
|
||||
if((r = fmt.match(/^[#0?]+$/))) {
|
||||
o = pad0r(val, 0);
|
||||
if(fmt.length <= o.length) return o;
|
||||
return hashq(fmt.substr(0,fmt.length-o.length)) + o;
|
||||
}
|
||||
if((r = fmt.match(/^([#0?]+)\.([#0]+)$/))) {
|
||||
o = "" + val.toFixed(Math.min(r[2].length,10)).replace(/([^0])0+$/,"$1");
|
||||
ri = o.indexOf(".");
|
||||
var lres = fmt.indexOf(".") - ri, rres = fmt.length - o.length - lres;
|
||||
return hashq(fmt.substr(0,lres) + o + fmt.substr(fmt.length-rres));
|
||||
}
|
||||
if((r = fmt.match(/^00,000\.([#0]*0)$/))) {
|
||||
ri = dec(val, r[1].length);
|
||||
return val < 0 ? "-" + write_num_flt(type, fmt, -val) : commaify(flr(val)).replace(/^\d,\d{3}$/,"0$&").replace(/^\d*$/,function($$) { return "00," + ($$.length < 3 ? pad0(0,3-$$.length) : "") + $$; }) + "." + pad0(ri,r[1].length);
|
||||
}
|
||||
switch(fmt) {
|
||||
case "###,##0.00": return write_num_flt(type, "#,##0.00", val);
|
||||
case "###,###":
|
||||
case "##,###":
|
||||
case "#,###": var x = commaify(pad0r(aval,0)); return x !== "0" ? sign + x : "";
|
||||
case "###,###.00": return write_num_flt(type, "###,##0.00",val).replace(/^0\./,".");
|
||||
case "#,###.00": return write_num_flt(type, "#,##0.00",val).replace(/^0\./,".");
|
||||
default:
|
||||
}
|
||||
throw new Error("unsupported format |" + fmt + "|");
|
||||
}
|
||||
function write_num_cm2(type/*:string*/, fmt/*:string*/, val/*:number*/)/*:string*/{
|
||||
var idx = fmt.length - 1;
|
||||
while(fmt.charCodeAt(idx-1) === 44) --idx;
|
||||
return write_num(type, fmt.substr(0,idx), val / Math.pow(10,3*(fmt.length-idx)));
|
||||
}
|
||||
function write_num_pct2(type/*:string*/, fmt/*:string*/, val/*:number*/)/*:string*/{
|
||||
var sfmt = fmt.replace(pct1,""), mul = fmt.length - sfmt.length;
|
||||
return write_num(type, sfmt, val * Math.pow(10,2*mul)) + fill("%",mul);
|
||||
}
|
||||
function write_num_exp2(fmt/*:string*/, val/*:number*/)/*:string*/{
|
||||
var o/*:string*/;
|
||||
var idx = fmt.indexOf("E") - fmt.indexOf(".") - 1;
|
||||
if(fmt.match(/^#+0.0E\+0$/)) {
|
||||
if(val == 0) return "0.0E+0";
|
||||
else if(val < 0) return "-" + write_num_exp2(fmt, -val);
|
||||
var period = fmt.indexOf("."); if(period === -1) period=fmt.indexOf('E');
|
||||
var ee = Math.floor(Math.log(val)*Math.LOG10E)%period;
|
||||
if(ee < 0) ee += period;
|
||||
o = (val/Math.pow(10,ee)).toPrecision(idx+1+(period+ee)%period);
|
||||
if(!o.match(/[Ee]/)) {
|
||||
var fakee = Math.floor(Math.log(val)*Math.LOG10E);
|
||||
if(o.indexOf(".") === -1) o = o.charAt(0) + "." + o.substr(1) + "E+" + (fakee - o.length+ee);
|
||||
else o += "E+" + (fakee - ee);
|
||||
o = o.replace(/\+-/,"-");
|
||||
}
|
||||
o = o.replace(/^([+-]?)(\d*)\.(\d*)[Ee]/,function($$,$1,$2,$3) { return $1 + $2 + $3.substr(0,(period+ee)%period) + "." + $3.substr(ee) + "E"; });
|
||||
} else o = val.toExponential(idx);
|
||||
if(fmt.match(/E\+00$/) && o.match(/e[+-]\d$/)) o = o.substr(0,o.length-1) + "0" + o.charAt(o.length-1);
|
||||
if(fmt.match(/E\-/) && o.match(/e\+/)) o = o.replace(/e\+/,"e");
|
||||
return o.replace("e","E");
|
||||
}
|
||||
function write_num_int(type/*:string*/, fmt/*:string*/, val/*:number*/)/*:string*/ {
|
||||
if(type.charCodeAt(0) === 40 && !fmt.match(closeparen)) {
|
||||
var ffmt = fmt.replace(/\( */,"").replace(/ \)/,"").replace(/\)/,"");
|
||||
if(val >= 0) return write_num_int('n', ffmt, val);
|
||||
return '(' + write_num_int('n', ffmt, -val) + ')';
|
||||
}
|
||||
if(fmt.charCodeAt(fmt.length - 1) === 44) return write_num_cm2(type, fmt, val);
|
||||
if(fmt.indexOf('%') !== -1) return write_num_pct2(type, fmt, val);
|
||||
if(fmt.indexOf('E') !== -1) return write_num_exp2(fmt, val);
|
||||
if(fmt.charCodeAt(0) === 36) return "$"+write_num_int(type,fmt.substr(fmt.charAt(1)==' '?2:1),val);
|
||||
var o;
|
||||
var r/*:?Array<string>*/, ri, ff, aval = Math.abs(val), sign = val < 0 ? "-" : "";
|
||||
if(fmt.match(/^00+$/)) return sign + pad0(aval,fmt.length);
|
||||
if(fmt.match(/^[#?]+$/)) {
|
||||
o = (""+val); if(val === 0) o = "";
|
||||
return o.length > fmt.length ? o : hashq(fmt.substr(0,fmt.length-o.length)) + o;
|
||||
}
|
||||
if((r = fmt.match(frac1))) return write_num_f2(r, aval, sign);
|
||||
if(fmt.match(/^#+0+$/)) return sign + pad0(aval,fmt.length - fmt.indexOf("0"));
|
||||
if((r = fmt.match(dec1))) {
|
||||
/*:: if(!Array.isArray(r)) throw new Error("unreachable"); */
|
||||
o = (""+val).replace(/^([^\.]+)$/,"$1."+hashq(r[1])).replace(/\.$/,"."+hashq(r[1]));
|
||||
o = o.replace(/\.(\d*)$/,function($$, $1) {
|
||||
/*:: if(!Array.isArray(r)) throw new Error("unreachable"); */
|
||||
return "." + $1 + fill("0", hashq(r[1]).length-$1.length); });
|
||||
return fmt.indexOf("0.") !== -1 ? o : o.replace(/^0\./,".");
|
||||
}
|
||||
fmt = fmt.replace(/^#+([0.])/, "$1");
|
||||
if((r = fmt.match(/^(0*)\.(#*)$/))) {
|
||||
return sign + (""+aval).replace(/\.(\d*[1-9])0*$/,".$1").replace(/^(-?\d*)$/,"$1.").replace(/^0\./,r[1].length?"0.":".");
|
||||
}
|
||||
if((r = fmt.match(/^#{1,3},##0(\.?)$/))) return sign + commaify((""+aval));
|
||||
if((r = fmt.match(/^#,##0\.([#0]*0)$/))) {
|
||||
return val < 0 ? "-" + write_num_int(type, fmt, -val) : commaify((""+val)) + "." + fill('0',r[1].length);
|
||||
}
|
||||
if((r = fmt.match(/^#,#*,#0/))) return write_num_int(type,fmt.replace(/^#,#*,/,""),val);
|
||||
if((r = fmt.match(/^([0#]+)(\\?-([0#]+))+$/))) {
|
||||
o = _strrev(write_num_int(type, fmt.replace(/[\\-]/g,""), val));
|
||||
ri = 0;
|
||||
return _strrev(_strrev(fmt.replace(/\\/g,"")).replace(/[0#]/g,function(x){return ri<o.length?o.charAt(ri++):x==='0'?'0':"";}));
|
||||
}
|
||||
if(fmt.match(phone)) {
|
||||
o = write_num_int(type, "##########", val);
|
||||
return "(" + o.substr(0,3) + ") " + o.substr(3, 3) + "-" + o.substr(6);
|
||||
}
|
||||
var oa = "";
|
||||
if((r = fmt.match(/^([#0?]+)( ?)\/( ?)([#0?]+)/))) {
|
||||
ri = Math.min(/*::String(*/r[4]/*::)*/.length,7);
|
||||
ff = frac(aval, Math.pow(10,ri)-1, false);
|
||||
o = "" + sign;
|
||||
oa = write_num("n", /*::String(*/r[1]/*::)*/, ff[1]);
|
||||
if(oa.charAt(oa.length-1) == " ") oa = oa.substr(0,oa.length-1) + "0";
|
||||
o += oa + /*::String(*/r[2]/*::)*/ + "/" + /*::String(*/r[3]/*::)*/;
|
||||
oa = rpad_(ff[2],ri);
|
||||
if(oa.length < r[4].length) oa = hashq(r[4].substr(r[4].length-oa.length)) + oa;
|
||||
o += oa;
|
||||
return o;
|
||||
}
|
||||
if((r = fmt.match(/^# ([#0?]+)( ?)\/( ?)([#0?]+)/))) {
|
||||
ri = Math.min(Math.max(r[1].length, r[4].length),7);
|
||||
ff = frac(aval, Math.pow(10,ri)-1, true);
|
||||
return sign + (ff[0]||(ff[1] ? "" : "0")) + " " + (ff[1] ? pad_(ff[1],ri) + r[2] + "/" + r[3] + rpad_(ff[2],ri): fill(" ", 2*ri+1 + r[2].length + r[3].length));
|
||||
}
|
||||
if((r = fmt.match(/^[#0?]+$/))) {
|
||||
o = "" + val;
|
||||
if(fmt.length <= o.length) return o;
|
||||
return hashq(fmt.substr(0,fmt.length-o.length)) + o;
|
||||
}
|
||||
if((r = fmt.match(/^([#0]+)\.([#0]+)$/))) {
|
||||
o = "" + val.toFixed(Math.min(r[2].length,10)).replace(/([^0])0+$/,"$1");
|
||||
ri = o.indexOf(".");
|
||||
var lres = fmt.indexOf(".") - ri, rres = fmt.length - o.length - lres;
|
||||
return hashq(fmt.substr(0,lres) + o + fmt.substr(fmt.length-rres));
|
||||
}
|
||||
if((r = fmt.match(/^00,000\.([#0]*0)$/))) {
|
||||
return val < 0 ? "-" + write_num_int(type, fmt, -val) : commaify(""+val).replace(/^\d,\d{3}$/,"0$&").replace(/^\d*$/,function($$) { return "00," + ($$.length < 3 ? pad0(0,3-$$.length) : "") + $$; }) + "." + pad0(0,r[1].length);
|
||||
}
|
||||
switch(fmt) {
|
||||
case "###,###":
|
||||
case "##,###":
|
||||
case "#,###": var x = commaify(""+aval); return x !== "0" ? sign + x : "";
|
||||
default:
|
||||
if(fmt.match(/\.[0#?]*$/)) return write_num_int(type, fmt.slice(0,fmt.lastIndexOf(".")), val) + hashq(fmt.slice(fmt.lastIndexOf(".")));
|
||||
}
|
||||
throw new Error("unsupported format |" + fmt + "|");
|
||||
}
|
||||
return function write_num(type/*:string*/, fmt/*:string*/, val/*:number*/)/*:string*/ {
|
||||
return (val|0) === val ? write_num_int(type, fmt, val) : write_num_flt(type, fmt, val);
|
||||
};})();
|
||||
function split_fmt(fmt/*:string*/)/*:Array<string>*/ {
|
||||
var out/*:Array<string>*/ = [];
|
||||
var in_str = false/*, cc*/;
|
||||
for(var i = 0, j = 0; i < fmt.length; ++i) switch((/*cc=*/fmt.charCodeAt(i))) {
|
||||
case 34: /* '"' */
|
||||
in_str = !in_str; break;
|
||||
case 95: case 42: case 92: /* '_' '*' '\\' */
|
||||
++i; break;
|
||||
case 59: /* ';' */
|
||||
out[out.length] = fmt.substr(j,i-j);
|
||||
j = i+1;
|
||||
}
|
||||
out[out.length] = fmt.substr(j);
|
||||
if(in_str === true) throw new Error("Format |" + fmt + "| unterminated string ");
|
||||
return out;
|
||||
}
|
||||
SSF._split = split_fmt;
|
||||
var abstime = /\[[HhMmSs\u0E0A\u0E19\u0E17]*\]/;
|
||||
function fmt_is_date(fmt/*:string*/)/*:boolean*/ {
|
||||
var i = 0, /*cc = 0,*/ c = "", o = "";
|
||||
while(i < fmt.length) {
|
||||
switch((c = fmt.charAt(i))) {
|
||||
case 'G': if(isgeneral(fmt, i)) i+= 6; i++; break;
|
||||
case '"': for(;(/*cc=*/fmt.charCodeAt(++i)) !== 34 && i < fmt.length;){/*empty*/} ++i; break;
|
||||
case '\\': i+=2; break;
|
||||
case '_': i+=2; break;
|
||||
case '@': ++i; break;
|
||||
case 'B': case 'b':
|
||||
if(fmt.charAt(i+1) === "1" || fmt.charAt(i+1) === "2") return true;
|
||||
/* falls through */
|
||||
case 'M': case 'D': case 'Y': case 'H': case 'S': case 'E':
|
||||
/* falls through */
|
||||
case 'm': case 'd': case 'y': case 'h': case 's': case 'e': case 'g': return true;
|
||||
case 'A': case 'a': case '上':
|
||||
if(fmt.substr(i, 3).toUpperCase() === "A/P") return true;
|
||||
if(fmt.substr(i, 5).toUpperCase() === "AM/PM") return true;
|
||||
if(fmt.substr(i, 5).toUpperCase() === "上午/下午") return true;
|
||||
++i; break;
|
||||
case '[':
|
||||
o = c;
|
||||
while(fmt.charAt(i++) !== ']' && i < fmt.length) o += fmt.charAt(i);
|
||||
if(o.match(abstime)) return true;
|
||||
break;
|
||||
case '.':
|
||||
/* falls through */
|
||||
case '0': case '#':
|
||||
while(i < fmt.length && ("0#?.,E+-%".indexOf(c=fmt.charAt(++i)) > -1 || (c=='\\' && fmt.charAt(i+1) == "-" && "0#".indexOf(fmt.charAt(i+2))>-1))){/* empty */}
|
||||
break;
|
||||
case '?': while(fmt.charAt(++i) === c){/* empty */} break;
|
||||
case '*': ++i; if(fmt.charAt(i) == ' ' || fmt.charAt(i) == '*') ++i; break;
|
||||
case '(': case ')': ++i; break;
|
||||
case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9':
|
||||
while(i < fmt.length && "0123456789".indexOf(fmt.charAt(++i)) > -1){/* empty */} break;
|
||||
case ' ': ++i; break;
|
||||
default: ++i; break;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
SSF.is_date = fmt_is_date;
|
||||
function eval_fmt(fmt/*:string*/, v/*:any*/, opts/*:any*/, flen/*:number*/) {
|
||||
var out = [], o = "", i = 0, c = "", lst='t', dt, j, cc;
|
||||
var hr='H';
|
||||
/* Tokenize */
|
||||
while(i < fmt.length) {
|
||||
switch((c = fmt.charAt(i))) {
|
||||
case 'G': /* General */
|
||||
if(!isgeneral(fmt, i)) throw new Error('unrecognized character ' + c + ' in ' +fmt);
|
||||
out[out.length] = {t:'G', v:'General'}; i+=7; break;
|
||||
case '"': /* Literal text */
|
||||
for(o="";(cc=fmt.charCodeAt(++i)) !== 34 && i < fmt.length;) o += String.fromCharCode(cc);
|
||||
out[out.length] = {t:'t', v:o}; ++i; break;
|
||||
case '\\': var w = fmt.charAt(++i), t = (w === "(" || w === ")") ? w : 't';
|
||||
out[out.length] = {t:t, v:w}; ++i; break;
|
||||
case '_': out[out.length] = {t:'t', v:" "}; i+=2; break;
|
||||
case '@': /* Text Placeholder */
|
||||
out[out.length] = {t:'T', v:v}; ++i; break;
|
||||
case 'B': case 'b':
|
||||
if(fmt.charAt(i+1) === "1" || fmt.charAt(i+1) === "2") {
|
||||
if(dt==null) { dt=parse_date_code(v, opts, fmt.charAt(i+1) === "2"); if(dt==null) return ""; }
|
||||
out[out.length] = {t:'X', v:fmt.substr(i,2)}; lst = c; i+=2; break;
|
||||
}
|
||||
/* falls through */
|
||||
case 'M': case 'D': case 'Y': case 'H': case 'S': case 'E':
|
||||
c = c.toLowerCase();
|
||||
/* falls through */
|
||||
case 'm': case 'd': case 'y': case 'h': case 's': case 'e': case 'g':
|
||||
if(v < 0) return "";
|
||||
if(dt==null) { dt=parse_date_code(v, opts); if(dt==null) return ""; }
|
||||
o = c; while(++i < fmt.length && fmt.charAt(i).toLowerCase() === c) o+=c;
|
||||
if(c === 'm' && lst.toLowerCase() === 'h') c = 'M';
|
||||
if(c === 'h') c = hr;
|
||||
out[out.length] = {t:c, v:o}; lst = c; break;
|
||||
case 'A': case 'a': case '上':
|
||||
var q={t:c, v:c};
|
||||
if(dt==null) dt=parse_date_code(v, opts);
|
||||
if(fmt.substr(i, 3).toUpperCase() === "A/P") { if(dt!=null) q.v = dt.H >= 12 ? "P" : "A"; q.t = 'T'; hr='h';i+=3;}
|
||||
else if(fmt.substr(i,5).toUpperCase() === "AM/PM") { if(dt!=null) q.v = dt.H >= 12 ? "PM" : "AM"; q.t = 'T'; i+=5; hr='h'; }
|
||||
else if(fmt.substr(i,5).toUpperCase() === "上午/下午") { if(dt!=null) q.v = dt.H >= 12 ? "下午" : "上午"; q.t = 'T'; i+=5; hr='h'; }
|
||||
else { q.t = "t"; ++i; }
|
||||
if(dt==null && q.t === 'T') return "";
|
||||
out[out.length] = q; lst = c; break;
|
||||
case '[':
|
||||
o = c;
|
||||
while(fmt.charAt(i++) !== ']' && i < fmt.length) o += fmt.charAt(i);
|
||||
if(o.slice(-1) !== ']') throw 'unterminated "[" block: |' + o + '|';
|
||||
if(o.match(abstime)) {
|
||||
if(dt==null) { dt=parse_date_code(v, opts); if(dt==null) return ""; }
|
||||
out[out.length] = {t:'Z', v:o.toLowerCase()};
|
||||
lst = o.charAt(1);
|
||||
} else if(o.indexOf("$") > -1) {
|
||||
o = (o.match(/\$([^-\[\]]*)/)||[])[1]||"$";
|
||||
if(!fmt_is_date(fmt)) out[out.length] = {t:'t',v:o};
|
||||
}
|
||||
break;
|
||||
/* Numbers */
|
||||
case '.':
|
||||
if(dt != null) {
|
||||
o = c; while(++i < fmt.length && (c=fmt.charAt(i)) === "0") o += c;
|
||||
out[out.length] = {t:'s', v:o}; break;
|
||||
}
|
||||
/* falls through */
|
||||
case '0': case '#':
|
||||
o = c; while(++i < fmt.length && "0#?.,E+-%".indexOf(c=fmt.charAt(i)) > -1) o += c;
|
||||
out[out.length] = {t:'n', v:o}; break;
|
||||
case '?':
|
||||
o = c; while(fmt.charAt(++i) === c) o+=c;
|
||||
out[out.length] = {t:c, v:o}; lst = c; break;
|
||||
case '*': ++i; if(fmt.charAt(i) == ' ' || fmt.charAt(i) == '*') ++i; break; // **
|
||||
case '(': case ')': out[out.length] = {t:(flen===1?'t':c), v:c}; ++i; break;
|
||||
case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9':
|
||||
o = c; while(i < fmt.length && "0123456789".indexOf(fmt.charAt(++i)) > -1) o+=fmt.charAt(i);
|
||||
out[out.length] = {t:'D', v:o}; break;
|
||||
case ' ': out[out.length] = {t:c, v:c}; ++i; break;
|
||||
case '$': out[out.length] = {t:'t', v:'$'}; ++i; break;
|
||||
default:
|
||||
if(",$-+/():!^&'~{}<>=€acfijklopqrtuvwxzP".indexOf(c) === -1) throw new Error('unrecognized character ' + c + ' in ' + fmt);
|
||||
out[out.length] = {t:'t', v:c}; ++i; break;
|
||||
}
|
||||
}
|
||||
|
||||
/* Scan for date/time parts */
|
||||
var bt = 0, ss0 = 0, ssm;
|
||||
for(i=out.length-1, lst='t'; i >= 0; --i) {
|
||||
switch(out[i].t) {
|
||||
case 'h': case 'H': out[i].t = hr; lst='h'; if(bt < 1) bt = 1; break;
|
||||
case 's':
|
||||
if((ssm=out[i].v.match(/\.0+$/))) ss0=Math.max(ss0,ssm[0].length-1);
|
||||
if(bt < 3) bt = 3;
|
||||
/* falls through */
|
||||
case 'd': case 'y': case 'M': case 'e': lst=out[i].t; break;
|
||||
case 'm': if(lst === 's') { out[i].t = 'M'; if(bt < 2) bt = 2; } break;
|
||||
case 'X': /*if(out[i].v === "B2");*/
|
||||
break;
|
||||
case 'Z':
|
||||
if(bt < 1 && out[i].v.match(/[Hh]/)) bt = 1;
|
||||
if(bt < 2 && out[i].v.match(/[Mm]/)) bt = 2;
|
||||
if(bt < 3 && out[i].v.match(/[Ss]/)) bt = 3;
|
||||
}
|
||||
}
|
||||
/* time rounding depends on presence of minute / second / usec fields */
|
||||
switch(bt) {
|
||||
case 0: break;
|
||||
case 1:
|
||||
/*::if(!dt) break;*/
|
||||
if(dt.u >= 0.5) { dt.u = 0; ++dt.S; }
|
||||
if(dt.S >= 60) { dt.S = 0; ++dt.M; }
|
||||
if(dt.M >= 60) { dt.M = 0; ++dt.H; }
|
||||
break;
|
||||
case 2:
|
||||
/*::if(!dt) break;*/
|
||||
if(dt.u >= 0.5) { dt.u = 0; ++dt.S; }
|
||||
if(dt.S >= 60) { dt.S = 0; ++dt.M; }
|
||||
break;
|
||||
}
|
||||
|
||||
/* replace fields */
|
||||
var nstr = "", jj;
|
||||
for(i=0; i < out.length; ++i) {
|
||||
switch(out[i].t) {
|
||||
case 't': case 'T': case ' ': case 'D': break;
|
||||
case 'X': out[i].v = ""; out[i].t = ";"; break;
|
||||
case 'd': case 'm': case 'y': case 'h': case 'H': case 'M': case 's': case 'e': case 'b': case 'Z':
|
||||
/*::if(!dt) throw "unreachable"; */
|
||||
out[i].v = write_date(out[i].t.charCodeAt(0), out[i].v, dt, ss0);
|
||||
out[i].t = 't'; break;
|
||||
case 'n': case '?':
|
||||
jj = i+1;
|
||||
while(out[jj] != null && (
|
||||
(c=out[jj].t) === "?" || c === "D" ||
|
||||
((c === " " || c === "t") && out[jj+1] != null && (out[jj+1].t === '?' || out[jj+1].t === "t" && out[jj+1].v === '/')) ||
|
||||
(out[i].t === '(' && (c === ' ' || c === 'n' || c === ')')) ||
|
||||
(c === 't' && (out[jj].v === '/' || out[jj].v === ' ' && out[jj+1] != null && out[jj+1].t == '?'))
|
||||
)) {
|
||||
out[i].v += out[jj].v;
|
||||
out[jj] = {v:"", t:";"}; ++jj;
|
||||
}
|
||||
nstr += out[i].v;
|
||||
i = jj-1; break;
|
||||
case 'G': out[i].t = 't'; out[i].v = general_fmt(v,opts); break;
|
||||
}
|
||||
}
|
||||
var vv = "", myv, ostr;
|
||||
if(nstr.length > 0) {
|
||||
if(nstr.charCodeAt(0) == 40) /* '(' */ {
|
||||
myv = (v<0&&nstr.charCodeAt(0) === 45 ? -v : v);
|
||||
ostr = write_num('n', nstr, myv);
|
||||
} else {
|
||||
myv = (v<0 && flen > 1 ? -v : v);
|
||||
ostr = write_num('n', nstr, myv);
|
||||
if(myv < 0 && out[0] && out[0].t == 't') {
|
||||
ostr = ostr.substr(1);
|
||||
out[0].v = "-" + out[0].v;
|
||||
}
|
||||
}
|
||||
jj=ostr.length-1;
|
||||
var decpt = out.length;
|
||||
for(i=0; i < out.length; ++i) if(out[i] != null && out[i].t != 't' && out[i].v.indexOf(".") > -1) { decpt = i; break; }
|
||||
var lasti=out.length;
|
||||
if(decpt === out.length && ostr.indexOf("E") === -1) {
|
||||
for(i=out.length-1; i>= 0;--i) {
|
||||
if(out[i] == null || 'n?'.indexOf(out[i].t) === -1) continue;
|
||||
if(jj>=out[i].v.length-1) { jj -= out[i].v.length; out[i].v = ostr.substr(jj+1, out[i].v.length); }
|
||||
else if(jj < 0) out[i].v = "";
|
||||
else { out[i].v = ostr.substr(0, jj+1); jj = -1; }
|
||||
out[i].t = 't';
|
||||
lasti = i;
|
||||
}
|
||||
if(jj>=0 && lasti<out.length) out[lasti].v = ostr.substr(0,jj+1) + out[lasti].v;
|
||||
}
|
||||
else if(decpt !== out.length && ostr.indexOf("E") === -1) {
|
||||
jj = ostr.indexOf(".")-1;
|
||||
for(i=decpt; i>= 0; --i) {
|
||||
if(out[i] == null || 'n?'.indexOf(out[i].t) === -1) continue;
|
||||
j=out[i].v.indexOf(".")>-1&&i===decpt?out[i].v.indexOf(".")-1:out[i].v.length-1;
|
||||
vv = out[i].v.substr(j+1);
|
||||
for(; j>=0; --j) {
|
||||
if(jj>=0 && (out[i].v.charAt(j) === "0" || out[i].v.charAt(j) === "#")) vv = ostr.charAt(jj--) + vv;
|
||||
}
|
||||
out[i].v = vv;
|
||||
out[i].t = 't';
|
||||
lasti = i;
|
||||
}
|
||||
if(jj>=0 && lasti<out.length) out[lasti].v = ostr.substr(0,jj+1) + out[lasti].v;
|
||||
jj = ostr.indexOf(".")+1;
|
||||
for(i=decpt; i<out.length; ++i) {
|
||||
if(out[i] == null || ('n?('.indexOf(out[i].t) === -1 && i !== decpt)) continue;
|
||||
j=out[i].v.indexOf(".")>-1&&i===decpt?out[i].v.indexOf(".")+1:0;
|
||||
vv = out[i].v.substr(0,j);
|
||||
for(; j<out[i].v.length; ++j) {
|
||||
if(jj<ostr.length) vv += ostr.charAt(jj++);
|
||||
}
|
||||
out[i].v = vv;
|
||||
out[i].t = 't';
|
||||
lasti = i;
|
||||
}
|
||||
}
|
||||
}
|
||||
for(i=0; i<out.length; ++i) if(out[i] != null && 'n?'.indexOf(out[i].t)>-1) {
|
||||
myv = (flen >1 && v < 0 && i>0 && out[i-1].v === "-" ? -v:v);
|
||||
out[i].v = write_num(out[i].t, out[i].v, myv);
|
||||
out[i].t = 't';
|
||||
}
|
||||
var retval = "";
|
||||
for(i=0; i !== out.length; ++i) if(out[i] != null) retval += out[i].v;
|
||||
return retval;
|
||||
}
|
||||
SSF._eval = eval_fmt;
|
||||
var cfregex = /\[[=<>]/;
|
||||
var cfregex2 = /\[(=|>[=]?|<[>=]?)(-?\d+(?:\.\d*)?)\]/;
|
||||
function chkcond(v, rr) {
|
||||
if(rr == null) return false;
|
||||
var thresh = parseFloat(rr[2]);
|
||||
switch(rr[1]) {
|
||||
case "=": if(v == thresh) return true; break;
|
||||
case ">": if(v > thresh) return true; break;
|
||||
case "<": if(v < thresh) return true; break;
|
||||
case "<>": if(v != thresh) return true; break;
|
||||
case ">=": if(v >= thresh) return true; break;
|
||||
case "<=": if(v <= thresh) return true; break;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
function choose_fmt(f/*:string*/, v/*:any*/) {
|
||||
var fmt = split_fmt(f);
|
||||
var l = fmt.length, lat = fmt[l-1].indexOf("@");
|
||||
if(l<4 && lat>-1) --l;
|
||||
if(fmt.length > 4) throw new Error("cannot find right format for |" + fmt.join("|") + "|");
|
||||
if(typeof v !== "number") return [4, fmt.length === 4 || lat>-1?fmt[fmt.length-1]:"@"];
|
||||
switch(fmt.length) {
|
||||
case 1: fmt = lat>-1 ? ["General", "General", "General", fmt[0]] : [fmt[0], fmt[0], fmt[0], "@"]; break;
|
||||
case 2: fmt = lat>-1 ? [fmt[0], fmt[0], fmt[0], fmt[1]] : [fmt[0], fmt[1], fmt[0], "@"]; break;
|
||||
case 3: fmt = lat>-1 ? [fmt[0], fmt[1], fmt[0], fmt[2]] : [fmt[0], fmt[1], fmt[2], "@"]; break;
|
||||
case 4: break;
|
||||
}
|
||||
var ff = v > 0 ? fmt[0] : v < 0 ? fmt[1] : fmt[2];
|
||||
if(fmt[0].indexOf("[") === -1 && fmt[1].indexOf("[") === -1) return [l, ff];
|
||||
if(fmt[0].match(cfregex) != null || fmt[1].match(cfregex) != null) {
|
||||
var m1 = fmt[0].match(cfregex2);
|
||||
var m2 = fmt[1].match(cfregex2);
|
||||
return chkcond(v, m1) ? [l, fmt[0]] : chkcond(v, m2) ? [l, fmt[1]] : [l, fmt[m1 != null && m2 != null ? 2 : 1]];
|
||||
}
|
||||
return [l, ff];
|
||||
}
|
||||
function format(fmt/*:string|number*/,v/*:any*/,o/*:?any*/) {
|
||||
if(o == null) o = {};
|
||||
var sfmt = "";
|
||||
switch(typeof fmt) {
|
||||
case "string":
|
||||
if(fmt == "m/d/yy" && o.dateNF) sfmt = o.dateNF;
|
||||
else sfmt = fmt;
|
||||
break;
|
||||
case "number":
|
||||
if(fmt == 14 && o.dateNF) sfmt = o.dateNF;
|
||||
else sfmt = (o.table != null ? (o.table/*:any*/) : table_fmt)[fmt];
|
||||
if(sfmt == null) sfmt = (o.table && o.table[default_map[fmt]]) || table_fmt[default_map[fmt]];
|
||||
if(sfmt == null) sfmt = default_str[fmt] || "General";
|
||||
break;
|
||||
}
|
||||
if(isgeneral(sfmt,0)) return general_fmt(v, o);
|
||||
if(v instanceof Date) v = datenum_local(v, o.date1904);
|
||||
var f = choose_fmt(sfmt, v);
|
||||
if(isgeneral(f[1])) return general_fmt(v, o);
|
||||
if(v === true) v = "TRUE"; else if(v === false) v = "FALSE";
|
||||
else if(v === "" || v == null) return "";
|
||||
return eval_fmt(f[1], v, o, f[0]);
|
||||
}
|
||||
function load_entry(fmt/*:string*/, idx/*:?number*/)/*:number*/ {
|
||||
if(typeof idx != 'number') {
|
||||
idx = +idx || -1;
|
||||
/*::if(typeof idx != 'number') return 0x188; */
|
||||
for(var i = 0; i < 0x0188; ++i) {
|
||||
/*::if(typeof idx != 'number') return 0x188; */
|
||||
if(table_fmt[i] == undefined) { if(idx < 0) idx = i; continue; }
|
||||
if(table_fmt[i] == fmt) { idx = i; break; }
|
||||
}
|
||||
/*::if(typeof idx != 'number') return 0x188; */
|
||||
if(idx < 0) idx = 0x187;
|
||||
}
|
||||
/*::if(typeof idx != 'number') return 0x188; */
|
||||
table_fmt[idx] = fmt;
|
||||
return idx;
|
||||
}
|
||||
SSF.load = load_entry;
|
||||
SSF._table = table_fmt;
|
||||
SSF.get_table = function get_table()/*:SSFTable*/ { return table_fmt; };
|
||||
SSF.load_table = function load_table(tbl/*:SSFTable*/)/*:void*/ {
|
||||
for(var i=0; i!=0x0188; ++i)
|
||||
if(tbl[i] !== undefined) load_entry(tbl[i], i);
|
||||
};
|
||||
SSF.init_table = init_table;
|
||||
SSF.format = format;
|
||||
};
|
||||
make_ssf(SSF);
|
||||
/*global module */
|
||||
if(typeof module !== 'undefined' && typeof DO_NOT_EXPORT_SSF === 'undefined') module.exports = SSF;
|
966
packages/ssf/ssf.js
Normal file
966
packages/ssf/ssf.js
Normal file
@ -0,0 +1,966 @@
|
||||
/* ssf.js (C) 2013-present SheetJS -- http://sheetjs.com */
|
||||
/* vim: set ts=2: */
|
||||
/*jshint -W041 */
|
||||
var SSF = ({});
|
||||
var make_ssf = function make_ssf(SSF){
|
||||
SSF.version = '0.11.2';
|
||||
function _strrev(x) { var o = "", i = x.length-1; while(i>=0) o += x.charAt(i--); return o; }
|
||||
function fill(c,l) { var o = ""; while(o.length < l) o+=c; return o; }
|
||||
function pad0(v,d){var t=""+v; return t.length>=d?t:fill('0',d-t.length)+t;}
|
||||
function pad_(v,d){var t=""+v;return t.length>=d?t:fill(' ',d-t.length)+t;}
|
||||
function rpad_(v,d){var t=""+v; return t.length>=d?t:t+fill(' ',d-t.length);}
|
||||
function pad0r1(v,d){var t=""+Math.round(v); return t.length>=d?t:fill('0',d-t.length)+t;}
|
||||
function pad0r2(v,d){var t=""+v; return t.length>=d?t:fill('0',d-t.length)+t;}
|
||||
var p2_32 = Math.pow(2,32);
|
||||
function pad0r(v,d){if(v>p2_32||v<-p2_32) return pad0r1(v,d); var i = Math.round(v); return pad0r2(i,d); }
|
||||
function isgeneral(s, i) { i = i || 0; return s.length >= 7 + i && (s.charCodeAt(i)|32) === 103 && (s.charCodeAt(i+1)|32) === 101 && (s.charCodeAt(i+2)|32) === 110 && (s.charCodeAt(i+3)|32) === 101 && (s.charCodeAt(i+4)|32) === 114 && (s.charCodeAt(i+5)|32) === 97 && (s.charCodeAt(i+6)|32) === 108; }
|
||||
var days = [
|
||||
['Sun', 'Sunday'],
|
||||
['Mon', 'Monday'],
|
||||
['Tue', 'Tuesday'],
|
||||
['Wed', 'Wednesday'],
|
||||
['Thu', 'Thursday'],
|
||||
['Fri', 'Friday'],
|
||||
['Sat', 'Saturday']
|
||||
];
|
||||
var months = [
|
||||
['J', 'Jan', 'January'],
|
||||
['F', 'Feb', 'February'],
|
||||
['M', 'Mar', 'March'],
|
||||
['A', 'Apr', 'April'],
|
||||
['M', 'May', 'May'],
|
||||
['J', 'Jun', 'June'],
|
||||
['J', 'Jul', 'July'],
|
||||
['A', 'Aug', 'August'],
|
||||
['S', 'Sep', 'September'],
|
||||
['O', 'Oct', 'October'],
|
||||
['N', 'Nov', 'November'],
|
||||
['D', 'Dec', 'December']
|
||||
];
|
||||
function init_table(t) {
|
||||
t[0]= 'General';
|
||||
t[1]= '0';
|
||||
t[2]= '0.00';
|
||||
t[3]= '#,##0';
|
||||
t[4]= '#,##0.00';
|
||||
t[9]= '0%';
|
||||
t[10]= '0.00%';
|
||||
t[11]= '0.00E+00';
|
||||
t[12]= '# ?/?';
|
||||
t[13]= '# ??/??';
|
||||
t[14]= 'm/d/yy';
|
||||
t[15]= 'd-mmm-yy';
|
||||
t[16]= 'd-mmm';
|
||||
t[17]= 'mmm-yy';
|
||||
t[18]= 'h:mm AM/PM';
|
||||
t[19]= 'h:mm:ss AM/PM';
|
||||
t[20]= 'h:mm';
|
||||
t[21]= 'h:mm:ss';
|
||||
t[22]= 'm/d/yy h:mm';
|
||||
t[37]= '#,##0 ;(#,##0)';
|
||||
t[38]= '#,##0 ;[Red](#,##0)';
|
||||
t[39]= '#,##0.00;(#,##0.00)';
|
||||
t[40]= '#,##0.00;[Red](#,##0.00)';
|
||||
t[45]= 'mm:ss';
|
||||
t[46]= '[h]:mm:ss';
|
||||
t[47]= 'mmss.0';
|
||||
t[48]= '##0.0E+0';
|
||||
t[49]= '@';
|
||||
t[56]= '"上午/下午 "hh"時"mm"分"ss"秒 "';
|
||||
}
|
||||
|
||||
var table_fmt = {};
|
||||
init_table(table_fmt);
|
||||
/* Defaults determined by systematically testing in Excel 2019 */
|
||||
|
||||
/* These formats appear to default to other formats in the table */
|
||||
var default_map = [];
|
||||
var defi = 0;
|
||||
|
||||
// 5 -> 37 ... 8 -> 40
|
||||
for(defi = 5; defi <= 8; ++defi) default_map[defi] = 32 + defi;
|
||||
|
||||
// 23 -> 0 ... 26 -> 0
|
||||
for(defi = 23; defi <= 26; ++defi) default_map[defi] = 0;
|
||||
|
||||
// 27 -> 14 ... 31 -> 14
|
||||
for(defi = 27; defi <= 31; ++defi) default_map[defi] = 14;
|
||||
// 50 -> 14 ... 58 -> 14
|
||||
for(defi = 50; defi <= 58; ++defi) default_map[defi] = 14;
|
||||
|
||||
// 59 -> 1 ... 62 -> 4
|
||||
for(defi = 59; defi <= 62; ++defi) default_map[defi] = defi - 58;
|
||||
// 67 -> 9 ... 68 -> 10
|
||||
for(defi = 67; defi <= 68; ++defi) default_map[defi] = defi - 58;
|
||||
// 72 -> 14 ... 75 -> 17
|
||||
for(defi = 72; defi <= 75; ++defi) default_map[defi] = defi - 58;
|
||||
|
||||
// 69 -> 12 ... 71 -> 14
|
||||
for(defi = 67; defi <= 68; ++defi) default_map[defi] = defi - 57;
|
||||
|
||||
// 76 -> 20 ... 78 -> 22
|
||||
for(defi = 76; defi <= 78; ++defi) default_map[defi] = defi - 56;
|
||||
|
||||
// 79 -> 45 ... 81 -> 47
|
||||
for(defi = 79; defi <= 81; ++defi) default_map[defi] = defi - 34;
|
||||
|
||||
// 82 -> 0 ... 65536 -> 0 (omitted)
|
||||
|
||||
/* These formats technically refer to Accounting formats with no equivalent */
|
||||
var default_str = [];
|
||||
|
||||
// 5 -- Currency, 0 decimal, black negative
|
||||
default_str[5] = default_str[63] = '"$"#,##0_);\\("$"#,##0\\)';
|
||||
// 6 -- Currency, 0 decimal, red negative
|
||||
default_str[6] = default_str[64] = '"$"#,##0_);[Red]\\("$"#,##0\\)';
|
||||
// 7 -- Currency, 2 decimal, black negative
|
||||
default_str[7] = default_str[65] = '"$"#,##0.00_);\\("$"#,##0.00\\)';
|
||||
// 8 -- Currency, 2 decimal, red negative
|
||||
default_str[8] = default_str[66] = '"$"#,##0.00_);[Red]\\("$"#,##0.00\\)';
|
||||
|
||||
// 41 -- Accounting, 0 decimal, No Symbol
|
||||
default_str[41] = '_(* #,##0_);_(* \\(#,##0\\);_(* "-"_);_(@_)';
|
||||
// 42 -- Accounting, 0 decimal, $ Symbol
|
||||
default_str[42] = '_("$"* #,##0_);_("$"* \\(#,##0\\);_("$"* "-"_);_(@_)';
|
||||
// 43 -- Accounting, 2 decimal, No Symbol
|
||||
default_str[43] = '_(* #,##0.00_);_(* \\(#,##0.00\\);_(* "-"??_);_(@_)';
|
||||
// 44 -- Accounting, 2 decimal, $ Symbol
|
||||
default_str[44] = '_("$"* #,##0.00_);_("$"* \\(#,##0.00\\);_("$"* "-"??_);_(@_)';
|
||||
function frac(x, D, mixed) {
|
||||
var sgn = x < 0 ? -1 : 1;
|
||||
var B = x * sgn;
|
||||
var P_2 = 0, P_1 = 1, P = 0;
|
||||
var Q_2 = 1, Q_1 = 0, Q = 0;
|
||||
var A = Math.floor(B);
|
||||
while(Q_1 < D) {
|
||||
A = Math.floor(B);
|
||||
P = A * P_1 + P_2;
|
||||
Q = A * Q_1 + Q_2;
|
||||
if((B - A) < 0.00000005) break;
|
||||
B = 1 / (B - A);
|
||||
P_2 = P_1; P_1 = P;
|
||||
Q_2 = Q_1; Q_1 = Q;
|
||||
}
|
||||
if(Q > D) { if(Q_1 > D) { Q = Q_2; P = P_2; } else { Q = Q_1; P = P_1; } }
|
||||
if(!mixed) return [0, sgn * P, Q];
|
||||
var q = Math.floor(sgn * P/Q);
|
||||
return [q, sgn*P - q*Q, Q];
|
||||
}
|
||||
function parse_date_code(v,opts,b2) {
|
||||
if(v > 2958465 || v < 0) return null;
|
||||
var date = (v|0), time = Math.floor(86400 * (v - date)), dow=0;
|
||||
var dout=[];
|
||||
var out={D:date, T:time, u:86400*(v-date)-time,y:0,m:0,d:0,H:0,M:0,S:0,q:0};
|
||||
if(Math.abs(out.u) < 1e-6) out.u = 0;
|
||||
if(opts && opts.date1904) date += 1462;
|
||||
if(out.u > 0.9999) {
|
||||
out.u = 0;
|
||||
if(++time == 86400) { out.T = time = 0; ++date; ++out.D; }
|
||||
}
|
||||
if(date === 60) {dout = b2 ? [1317,10,29] : [1900,2,29]; dow=3;}
|
||||
else if(date === 0) {dout = b2 ? [1317,8,29] : [1900,1,0]; dow=6;}
|
||||
else {
|
||||
if(date > 60) --date;
|
||||
/* 1 = Jan 1 1900 in Gregorian */
|
||||
var d = new Date(1900, 0, 1);
|
||||
d.setDate(d.getDate() + date - 1);
|
||||
dout = [d.getFullYear(), d.getMonth()+1,d.getDate()];
|
||||
dow = d.getDay();
|
||||
if(date < 60) dow = (dow + 6) % 7;
|
||||
if(b2) dow = fix_hijri(d, dout);
|
||||
}
|
||||
out.y = dout[0]; out.m = dout[1]; out.d = dout[2];
|
||||
out.S = time % 60; time = Math.floor(time / 60);
|
||||
out.M = time % 60; time = Math.floor(time / 60);
|
||||
out.H = time;
|
||||
out.q = dow;
|
||||
return out;
|
||||
}
|
||||
SSF.parse_date_code = parse_date_code;
|
||||
var basedate = new Date(1899, 11, 31, 0, 0, 0);
|
||||
var dnthresh = basedate.getTime();
|
||||
var base1904 = new Date(1900, 2, 1, 0, 0, 0);
|
||||
function datenum_local(v, date1904) {
|
||||
var epoch = v.getTime();
|
||||
if(date1904) epoch -= 1461*24*60*60*1000;
|
||||
else if(v >= base1904) epoch += 24*60*60*1000;
|
||||
return (epoch - (dnthresh + (v.getTimezoneOffset() - basedate.getTimezoneOffset()) * 60000)) / (24 * 60 * 60 * 1000);
|
||||
}
|
||||
/* The longest 32-bit integer text is "-4294967296", exactly 11 chars */
|
||||
function general_fmt_int(v) { return v.toString(10); }
|
||||
SSF._general_int = general_fmt_int;
|
||||
|
||||
/* ECMA-376 18.8.30 numFmt*/
|
||||
/* Note: `toPrecision` uses standard form when prec > E and E >= -6 */
|
||||
var general_fmt_num = (function make_general_fmt_num() {
|
||||
var trailing_zeroes_and_decimal = /(?:\.0*|(\.\d*[1-9])0+)$/;
|
||||
function strip_decimal(o) {
|
||||
return (o.indexOf(".") == -1) ? o : o.replace(trailing_zeroes_and_decimal, "$1");
|
||||
}
|
||||
|
||||
/* General Exponential always shows 2 digits exp and trims the mantissa */
|
||||
var mantissa_zeroes_and_decimal = /(?:\.0*|(\.\d*[1-9])0+)[Ee]/;
|
||||
var exp_with_single_digit = /(E[+-])(\d)$/;
|
||||
function normalize_exp(o) {
|
||||
if(o.indexOf("E") == -1) return o;
|
||||
return o.replace(mantissa_zeroes_and_decimal,"$1E").replace(exp_with_single_digit,"$10$2");
|
||||
}
|
||||
|
||||
/* exponent >= -9 and <= 9 */
|
||||
function small_exp(v) {
|
||||
var w = (v<0?12:11);
|
||||
var o = strip_decimal(v.toFixed(12)); if(o.length <= w) return o;
|
||||
o = v.toPrecision(10); if(o.length <= w) return o;
|
||||
return v.toExponential(5);
|
||||
}
|
||||
|
||||
/* exponent >= 11 or <= -10 likely exponential */
|
||||
function large_exp(v) {
|
||||
var o = strip_decimal(v.toFixed(11));
|
||||
return (o.length > (v<0?12:11) || o === "0" || o === "-0") ? v.toPrecision(6) : o;
|
||||
}
|
||||
|
||||
function general_fmt_num_base(v) {
|
||||
var V = Math.floor(Math.log(Math.abs(v))*Math.LOG10E), o;
|
||||
|
||||
if(V >= -4 && V <= -1) o = v.toPrecision(10+V);
|
||||
else if(Math.abs(V) <= 9) o = small_exp(v);
|
||||
else if(V === 10) o = v.toFixed(10).substr(0,12);
|
||||
else o = large_exp(v);
|
||||
|
||||
return strip_decimal(normalize_exp(o.toUpperCase()));
|
||||
}
|
||||
|
||||
return general_fmt_num_base;
|
||||
})();
|
||||
SSF._general_num = general_fmt_num;
|
||||
|
||||
/*
|
||||
"General" rules:
|
||||
- text is passed through ("@")
|
||||
- booleans are rendered as TRUE/FALSE
|
||||
- "up to 11 characters" displayed for numbers
|
||||
- Default date format (code 14) used for Dates
|
||||
|
||||
TODO: technically the display depends on the width of the cell
|
||||
*/
|
||||
function general_fmt(v, opts) {
|
||||
switch(typeof v) {
|
||||
case 'string': return v;
|
||||
case 'boolean': return v ? "TRUE" : "FALSE";
|
||||
case 'number': return (v|0) === v ? v.toString(10) : general_fmt_num(v);
|
||||
case 'undefined': return "";
|
||||
case 'object':
|
||||
if(v == null) return "";
|
||||
if(v instanceof Date) return format(14, datenum_local(v, opts && opts.date1904), opts);
|
||||
}
|
||||
throw new Error("unsupported value in General format: " + v);
|
||||
}
|
||||
SSF._general = general_fmt;
|
||||
function fix_hijri(date, o) {
|
||||
/* TODO: properly adjust y/m/d and */
|
||||
o[0] -= 581;
|
||||
var dow = date.getDay();
|
||||
if(date < 60) dow = (dow + 6) % 7;
|
||||
return dow;
|
||||
}
|
||||
var THAI_DIGITS = "\u0E50\u0E51\u0E52\u0E53\u0E54\u0E55\u0E56\u0E57\u0E58\u0E59".split("");
|
||||
/*jshint -W086 */
|
||||
function write_date(type, fmt, val, ss0) {
|
||||
var o="", ss=0, tt=0, y = val.y, out, outl = 0;
|
||||
switch(type) {
|
||||
case 98: /* 'b' buddhist year */
|
||||
y = val.y + 543;
|
||||
/* falls through */
|
||||
case 121: /* 'y' year */
|
||||
switch(fmt.length) {
|
||||
case 1: case 2: out = y % 100; outl = 2; break;
|
||||
default: out = y % 10000; outl = 4; break;
|
||||
} break;
|
||||
case 109: /* 'm' month */
|
||||
switch(fmt.length) {
|
||||
case 1: case 2: out = val.m; outl = fmt.length; break;
|
||||
case 3: return months[val.m-1][1];
|
||||
case 5: return months[val.m-1][0];
|
||||
default: return months[val.m-1][2];
|
||||
} break;
|
||||
case 100: /* 'd' day */
|
||||
switch(fmt.length) {
|
||||
case 1: case 2: out = val.d; outl = fmt.length; break;
|
||||
case 3: return days[val.q][0];
|
||||
default: return days[val.q][1];
|
||||
} break;
|
||||
case 104: /* 'h' 12-hour */
|
||||
switch(fmt.length) {
|
||||
case 1: case 2: out = 1+(val.H+11)%12; outl = fmt.length; break;
|
||||
default: throw 'bad hour format: ' + fmt;
|
||||
} break;
|
||||
case 72: /* 'H' 24-hour */
|
||||
switch(fmt.length) {
|
||||
case 1: case 2: out = val.H; outl = fmt.length; break;
|
||||
default: throw 'bad hour format: ' + fmt;
|
||||
} break;
|
||||
case 77: /* 'M' minutes */
|
||||
switch(fmt.length) {
|
||||
case 1: case 2: out = val.M; outl = fmt.length; break;
|
||||
default: throw 'bad minute format: ' + fmt;
|
||||
} break;
|
||||
case 115: /* 's' seconds */
|
||||
if(fmt != 's' && fmt != 'ss' && fmt != '.0' && fmt != '.00' && fmt != '.000') throw 'bad second format: ' + fmt;
|
||||
if(val.u === 0 && (fmt == "s" || fmt == "ss")) return pad0(val.S, fmt.length);
|
||||
if(ss0 >= 2) tt = ss0 === 3 ? 1000 : 100;
|
||||
else tt = ss0 === 1 ? 10 : 1;
|
||||
ss = Math.round((tt)*(val.S + val.u));
|
||||
if(ss >= 60*tt) ss = 0;
|
||||
if(fmt === 's') return ss === 0 ? "0" : ""+ss/tt;
|
||||
o = pad0(ss,2 + ss0);
|
||||
if(fmt === 'ss') return o.substr(0,2);
|
||||
return "." + o.substr(2,fmt.length-1);
|
||||
case 90: /* 'Z' absolute time */
|
||||
switch(fmt) {
|
||||
case '[h]': case '[hh]': out = val.D*24+val.H; break;
|
||||
case '[m]': case '[mm]': out = (val.D*24+val.H)*60+val.M; break;
|
||||
case '[s]': case '[ss]': out = ((val.D*24+val.H)*60+val.M)*60+Math.round(val.S+val.u); break;
|
||||
default: throw 'bad abstime format: ' + fmt;
|
||||
} outl = fmt.length === 3 ? 1 : 2; break;
|
||||
case 101: /* 'e' era */
|
||||
out = y; outl = 1; break;
|
||||
}
|
||||
var outstr = outl > 0 ? pad0(out, outl) : "";
|
||||
return outstr;
|
||||
}
|
||||
/*jshint +W086 */
|
||||
function commaify(s) {
|
||||
var w = 3;
|
||||
if(s.length <= w) return s;
|
||||
var j = (s.length % w), o = s.substr(0,j);
|
||||
for(; j!=s.length; j+=w) o+=(o.length > 0 ? "," : "") + s.substr(j,w);
|
||||
return o;
|
||||
}
|
||||
var write_num = (function make_write_num(){
|
||||
var pct1 = /%/g;
|
||||
function write_num_pct(type, fmt, val){
|
||||
var sfmt = fmt.replace(pct1,""), mul = fmt.length - sfmt.length;
|
||||
return write_num(type, sfmt, val * Math.pow(10,2*mul)) + fill("%",mul);
|
||||
}
|
||||
function write_num_cm(type, fmt, val){
|
||||
var idx = fmt.length - 1;
|
||||
while(fmt.charCodeAt(idx-1) === 44) --idx;
|
||||
return write_num(type, fmt.substr(0,idx), val / Math.pow(10,3*(fmt.length-idx)));
|
||||
}
|
||||
function write_num_exp(fmt, val){
|
||||
var o;
|
||||
var idx = fmt.indexOf("E") - fmt.indexOf(".") - 1;
|
||||
if(fmt.match(/^#+0.0E\+0$/)) {
|
||||
if(val == 0) return "0.0E+0";
|
||||
else if(val < 0) return "-" + write_num_exp(fmt, -val);
|
||||
var period = fmt.indexOf("."); if(period === -1) period=fmt.indexOf('E');
|
||||
var ee = Math.floor(Math.log(val)*Math.LOG10E)%period;
|
||||
if(ee < 0) ee += period;
|
||||
o = (val/Math.pow(10,ee)).toPrecision(idx+1+(period+ee)%period);
|
||||
if(o.indexOf("e") === -1) {
|
||||
var fakee = Math.floor(Math.log(val)*Math.LOG10E);
|
||||
if(o.indexOf(".") === -1) o = o.charAt(0) + "." + o.substr(1) + "E+" + (fakee - o.length+ee);
|
||||
else o += "E+" + (fakee - ee);
|
||||
while(o.substr(0,2) === "0.") {
|
||||
o = o.charAt(0) + o.substr(2,period) + "." + o.substr(2+period);
|
||||
o = o.replace(/^0+([1-9])/,"$1").replace(/^0+\./,"0.");
|
||||
}
|
||||
o = o.replace(/\+-/,"-");
|
||||
}
|
||||
o = o.replace(/^([+-]?)(\d*)\.(\d*)[Ee]/,function($$,$1,$2,$3) { return $1 + $2 + $3.substr(0,(period+ee)%period) + "." + $3.substr(ee) + "E"; });
|
||||
} else o = val.toExponential(idx);
|
||||
if(fmt.match(/E\+00$/) && o.match(/e[+-]\d$/)) o = o.substr(0,o.length-1) + "0" + o.charAt(o.length-1);
|
||||
if(fmt.match(/E\-/) && o.match(/e\+/)) o = o.replace(/e\+/,"e");
|
||||
return o.replace("e","E");
|
||||
}
|
||||
var frac1 = /# (\?+)( ?)\/( ?)(\d+)/;
|
||||
function write_num_f1(r, aval, sign) {
|
||||
var den = parseInt(r[4],10), rr = Math.round(aval * den), base = Math.floor(rr/den);
|
||||
var myn = (rr - base*den), myd = den;
|
||||
return sign + (base === 0 ? "" : ""+base) + " " + (myn === 0 ? fill(" ", r[1].length + 1 + r[4].length) : pad_(myn,r[1].length) + r[2] + "/" + r[3] + pad0(myd,r[4].length));
|
||||
}
|
||||
function write_num_f2(r, aval, sign) {
|
||||
return sign + (aval === 0 ? "" : ""+aval) + fill(" ", r[1].length + 2 + r[4].length);
|
||||
}
|
||||
var dec1 = /^#*0*\.([0#]+)/;
|
||||
var closeparen = /\).*[0#]/;
|
||||
var phone = /\(###\) ###\\?-####/;
|
||||
function hashq(str) {
|
||||
var o = "", cc;
|
||||
for(var i = 0; i != str.length; ++i) switch((cc=str.charCodeAt(i))) {
|
||||
case 35: break;
|
||||
case 63: o+= " "; break;
|
||||
case 48: o+= "0"; break;
|
||||
default: o+= String.fromCharCode(cc);
|
||||
}
|
||||
return o;
|
||||
}
|
||||
function rnd(val, d) { var dd = Math.pow(10,d); return ""+(Math.round(val * dd)/dd); }
|
||||
function dec(val, d) {
|
||||
var _frac = val - Math.floor(val), dd = Math.pow(10,d);
|
||||
if (d < ('' + Math.round(_frac * dd)).length) return 0;
|
||||
return Math.round(_frac * dd);
|
||||
}
|
||||
function carry(val, d) {
|
||||
if (d < ('' + Math.round((val-Math.floor(val))*Math.pow(10,d))).length) {
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
function flr(val) {
|
||||
if(val < 2147483647 && val > -2147483648) return ""+(val >= 0 ? (val|0) : (val-1|0));
|
||||
return ""+Math.floor(val);
|
||||
}
|
||||
function write_num_flt(type, fmt, val) {
|
||||
if(type.charCodeAt(0) === 40 && !fmt.match(closeparen)) {
|
||||
var ffmt = fmt.replace(/\( */,"").replace(/ \)/,"").replace(/\)/,"");
|
||||
if(val >= 0) return write_num_flt('n', ffmt, val);
|
||||
return '(' + write_num_flt('n', ffmt, -val) + ')';
|
||||
}
|
||||
if(fmt.charCodeAt(fmt.length - 1) === 44) return write_num_cm(type, fmt, val);
|
||||
if(fmt.indexOf('%') !== -1) return write_num_pct(type, fmt, val);
|
||||
if(fmt.indexOf('E') !== -1) return write_num_exp(fmt, val);
|
||||
if(fmt.charCodeAt(0) === 36) return "$"+write_num_flt(type,fmt.substr(fmt.charAt(1)==' '?2:1),val);
|
||||
var o;
|
||||
var r, ri, ff, aval = Math.abs(val), sign = val < 0 ? "-" : "";
|
||||
if(fmt.match(/^00+$/)) return sign + pad0r(aval,fmt.length);
|
||||
if(fmt.match(/^[#?]+$/)) {
|
||||
o = pad0r(val,0); if(o === "0") o = "";
|
||||
return o.length > fmt.length ? o : hashq(fmt.substr(0,fmt.length-o.length)) + o;
|
||||
}
|
||||
if((r = fmt.match(frac1))) return write_num_f1(r, aval, sign);
|
||||
if(fmt.match(/^#+0+$/)) return sign + pad0r(aval,fmt.length - fmt.indexOf("0"));
|
||||
if((r = fmt.match(dec1))) {
|
||||
o = rnd(val, r[1].length).replace(/^([^\.]+)$/,"$1."+hashq(r[1])).replace(/\.$/,"."+hashq(r[1])).replace(/\.(\d*)$/,function($$, $1) { return "." + $1 + fill("0", hashq(r[1]).length-$1.length); });
|
||||
return fmt.indexOf("0.") !== -1 ? o : o.replace(/^0\./,".");
|
||||
}
|
||||
fmt = fmt.replace(/^#+([0.])/, "$1");
|
||||
if((r = fmt.match(/^(0*)\.(#*)$/))) {
|
||||
return sign + rnd(aval, r[2].length).replace(/\.(\d*[1-9])0*$/,".$1").replace(/^(-?\d*)$/,"$1.").replace(/^0\./,r[1].length?"0.":".");
|
||||
}
|
||||
if((r = fmt.match(/^#{1,3},##0(\.?)$/))) return sign + commaify(pad0r(aval,0));
|
||||
if((r = fmt.match(/^#,##0\.([#0]*0)$/))) {
|
||||
return val < 0 ? "-" + write_num_flt(type, fmt, -val) : commaify(""+(Math.floor(val) + carry(val, r[1].length))) + "." + pad0(dec(val, r[1].length),r[1].length);
|
||||
}
|
||||
if((r = fmt.match(/^#,#*,#0/))) return write_num_flt(type,fmt.replace(/^#,#*,/,""),val);
|
||||
if((r = fmt.match(/^([0#]+)(\\?-([0#]+))+$/))) {
|
||||
o = _strrev(write_num_flt(type, fmt.replace(/[\\-]/g,""), val));
|
||||
ri = 0;
|
||||
return _strrev(_strrev(fmt.replace(/\\/g,"")).replace(/[0#]/g,function(x){return ri<o.length?o.charAt(ri++):x==='0'?'0':"";}));
|
||||
}
|
||||
if(fmt.match(phone)) {
|
||||
o = write_num_flt(type, "##########", val);
|
||||
return "(" + o.substr(0,3) + ") " + o.substr(3, 3) + "-" + o.substr(6);
|
||||
}
|
||||
var oa = "";
|
||||
if((r = fmt.match(/^([#0?]+)( ?)\/( ?)([#0?]+)/))) {
|
||||
ri = Math.min(r[4].length,7);
|
||||
ff = frac(aval, Math.pow(10,ri)-1, false);
|
||||
o = "" + sign;
|
||||
oa = write_num("n", r[1], ff[1]);
|
||||
if(oa.charAt(oa.length-1) == " ") oa = oa.substr(0,oa.length-1) + "0";
|
||||
o += oa + r[2] + "/" + r[3];
|
||||
oa = rpad_(ff[2],ri);
|
||||
if(oa.length < r[4].length) oa = hashq(r[4].substr(r[4].length-oa.length)) + oa;
|
||||
o += oa;
|
||||
return o;
|
||||
}
|
||||
if((r = fmt.match(/^# ([#0?]+)( ?)\/( ?)([#0?]+)/))) {
|
||||
ri = Math.min(Math.max(r[1].length, r[4].length),7);
|
||||
ff = frac(aval, Math.pow(10,ri)-1, true);
|
||||
return sign + (ff[0]||(ff[1] ? "" : "0")) + " " + (ff[1] ? pad_(ff[1],ri) + r[2] + "/" + r[3] + rpad_(ff[2],ri): fill(" ", 2*ri+1 + r[2].length + r[3].length));
|
||||
}
|
||||
if((r = fmt.match(/^[#0?]+$/))) {
|
||||
o = pad0r(val, 0);
|
||||
if(fmt.length <= o.length) return o;
|
||||
return hashq(fmt.substr(0,fmt.length-o.length)) + o;
|
||||
}
|
||||
if((r = fmt.match(/^([#0?]+)\.([#0]+)$/))) {
|
||||
o = "" + val.toFixed(Math.min(r[2].length,10)).replace(/([^0])0+$/,"$1");
|
||||
ri = o.indexOf(".");
|
||||
var lres = fmt.indexOf(".") - ri, rres = fmt.length - o.length - lres;
|
||||
return hashq(fmt.substr(0,lres) + o + fmt.substr(fmt.length-rres));
|
||||
}
|
||||
if((r = fmt.match(/^00,000\.([#0]*0)$/))) {
|
||||
ri = dec(val, r[1].length);
|
||||
return val < 0 ? "-" + write_num_flt(type, fmt, -val) : commaify(flr(val)).replace(/^\d,\d{3}$/,"0$&").replace(/^\d*$/,function($$) { return "00," + ($$.length < 3 ? pad0(0,3-$$.length) : "") + $$; }) + "." + pad0(ri,r[1].length);
|
||||
}
|
||||
switch(fmt) {
|
||||
case "###,##0.00": return write_num_flt(type, "#,##0.00", val);
|
||||
case "###,###":
|
||||
case "##,###":
|
||||
case "#,###": var x = commaify(pad0r(aval,0)); return x !== "0" ? sign + x : "";
|
||||
case "###,###.00": return write_num_flt(type, "###,##0.00",val).replace(/^0\./,".");
|
||||
case "#,###.00": return write_num_flt(type, "#,##0.00",val).replace(/^0\./,".");
|
||||
default:
|
||||
}
|
||||
throw new Error("unsupported format |" + fmt + "|");
|
||||
}
|
||||
function write_num_cm2(type, fmt, val){
|
||||
var idx = fmt.length - 1;
|
||||
while(fmt.charCodeAt(idx-1) === 44) --idx;
|
||||
return write_num(type, fmt.substr(0,idx), val / Math.pow(10,3*(fmt.length-idx)));
|
||||
}
|
||||
function write_num_pct2(type, fmt, val){
|
||||
var sfmt = fmt.replace(pct1,""), mul = fmt.length - sfmt.length;
|
||||
return write_num(type, sfmt, val * Math.pow(10,2*mul)) + fill("%",mul);
|
||||
}
|
||||
function write_num_exp2(fmt, val){
|
||||
var o;
|
||||
var idx = fmt.indexOf("E") - fmt.indexOf(".") - 1;
|
||||
if(fmt.match(/^#+0.0E\+0$/)) {
|
||||
if(val == 0) return "0.0E+0";
|
||||
else if(val < 0) return "-" + write_num_exp2(fmt, -val);
|
||||
var period = fmt.indexOf("."); if(period === -1) period=fmt.indexOf('E');
|
||||
var ee = Math.floor(Math.log(val)*Math.LOG10E)%period;
|
||||
if(ee < 0) ee += period;
|
||||
o = (val/Math.pow(10,ee)).toPrecision(idx+1+(period+ee)%period);
|
||||
if(!o.match(/[Ee]/)) {
|
||||
var fakee = Math.floor(Math.log(val)*Math.LOG10E);
|
||||
if(o.indexOf(".") === -1) o = o.charAt(0) + "." + o.substr(1) + "E+" + (fakee - o.length+ee);
|
||||
else o += "E+" + (fakee - ee);
|
||||
o = o.replace(/\+-/,"-");
|
||||
}
|
||||
o = o.replace(/^([+-]?)(\d*)\.(\d*)[Ee]/,function($$,$1,$2,$3) { return $1 + $2 + $3.substr(0,(period+ee)%period) + "." + $3.substr(ee) + "E"; });
|
||||
} else o = val.toExponential(idx);
|
||||
if(fmt.match(/E\+00$/) && o.match(/e[+-]\d$/)) o = o.substr(0,o.length-1) + "0" + o.charAt(o.length-1);
|
||||
if(fmt.match(/E\-/) && o.match(/e\+/)) o = o.replace(/e\+/,"e");
|
||||
return o.replace("e","E");
|
||||
}
|
||||
function write_num_int(type, fmt, val) {
|
||||
if(type.charCodeAt(0) === 40 && !fmt.match(closeparen)) {
|
||||
var ffmt = fmt.replace(/\( */,"").replace(/ \)/,"").replace(/\)/,"");
|
||||
if(val >= 0) return write_num_int('n', ffmt, val);
|
||||
return '(' + write_num_int('n', ffmt, -val) + ')';
|
||||
}
|
||||
if(fmt.charCodeAt(fmt.length - 1) === 44) return write_num_cm2(type, fmt, val);
|
||||
if(fmt.indexOf('%') !== -1) return write_num_pct2(type, fmt, val);
|
||||
if(fmt.indexOf('E') !== -1) return write_num_exp2(fmt, val);
|
||||
if(fmt.charCodeAt(0) === 36) return "$"+write_num_int(type,fmt.substr(fmt.charAt(1)==' '?2:1),val);
|
||||
var o;
|
||||
var r, ri, ff, aval = Math.abs(val), sign = val < 0 ? "-" : "";
|
||||
if(fmt.match(/^00+$/)) return sign + pad0(aval,fmt.length);
|
||||
if(fmt.match(/^[#?]+$/)) {
|
||||
o = (""+val); if(val === 0) o = "";
|
||||
return o.length > fmt.length ? o : hashq(fmt.substr(0,fmt.length-o.length)) + o;
|
||||
}
|
||||
if((r = fmt.match(frac1))) return write_num_f2(r, aval, sign);
|
||||
if(fmt.match(/^#+0+$/)) return sign + pad0(aval,fmt.length - fmt.indexOf("0"));
|
||||
if((r = fmt.match(dec1))) {
|
||||
o = (""+val).replace(/^([^\.]+)$/,"$1."+hashq(r[1])).replace(/\.$/,"."+hashq(r[1]));
|
||||
o = o.replace(/\.(\d*)$/,function($$, $1) {
|
||||
return "." + $1 + fill("0", hashq(r[1]).length-$1.length); });
|
||||
return fmt.indexOf("0.") !== -1 ? o : o.replace(/^0\./,".");
|
||||
}
|
||||
fmt = fmt.replace(/^#+([0.])/, "$1");
|
||||
if((r = fmt.match(/^(0*)\.(#*)$/))) {
|
||||
return sign + (""+aval).replace(/\.(\d*[1-9])0*$/,".$1").replace(/^(-?\d*)$/,"$1.").replace(/^0\./,r[1].length?"0.":".");
|
||||
}
|
||||
if((r = fmt.match(/^#{1,3},##0(\.?)$/))) return sign + commaify((""+aval));
|
||||
if((r = fmt.match(/^#,##0\.([#0]*0)$/))) {
|
||||
return val < 0 ? "-" + write_num_int(type, fmt, -val) : commaify((""+val)) + "." + fill('0',r[1].length);
|
||||
}
|
||||
if((r = fmt.match(/^#,#*,#0/))) return write_num_int(type,fmt.replace(/^#,#*,/,""),val);
|
||||
if((r = fmt.match(/^([0#]+)(\\?-([0#]+))+$/))) {
|
||||
o = _strrev(write_num_int(type, fmt.replace(/[\\-]/g,""), val));
|
||||
ri = 0;
|
||||
return _strrev(_strrev(fmt.replace(/\\/g,"")).replace(/[0#]/g,function(x){return ri<o.length?o.charAt(ri++):x==='0'?'0':"";}));
|
||||
}
|
||||
if(fmt.match(phone)) {
|
||||
o = write_num_int(type, "##########", val);
|
||||
return "(" + o.substr(0,3) + ") " + o.substr(3, 3) + "-" + o.substr(6);
|
||||
}
|
||||
var oa = "";
|
||||
if((r = fmt.match(/^([#0?]+)( ?)\/( ?)([#0?]+)/))) {
|
||||
ri = Math.min(r[4].length,7);
|
||||
ff = frac(aval, Math.pow(10,ri)-1, false);
|
||||
o = "" + sign;
|
||||
oa = write_num("n", r[1], ff[1]);
|
||||
if(oa.charAt(oa.length-1) == " ") oa = oa.substr(0,oa.length-1) + "0";
|
||||
o += oa + r[2] + "/" + r[3];
|
||||
oa = rpad_(ff[2],ri);
|
||||
if(oa.length < r[4].length) oa = hashq(r[4].substr(r[4].length-oa.length)) + oa;
|
||||
o += oa;
|
||||
return o;
|
||||
}
|
||||
if((r = fmt.match(/^# ([#0?]+)( ?)\/( ?)([#0?]+)/))) {
|
||||
ri = Math.min(Math.max(r[1].length, r[4].length),7);
|
||||
ff = frac(aval, Math.pow(10,ri)-1, true);
|
||||
return sign + (ff[0]||(ff[1] ? "" : "0")) + " " + (ff[1] ? pad_(ff[1],ri) + r[2] + "/" + r[3] + rpad_(ff[2],ri): fill(" ", 2*ri+1 + r[2].length + r[3].length));
|
||||
}
|
||||
if((r = fmt.match(/^[#0?]+$/))) {
|
||||
o = "" + val;
|
||||
if(fmt.length <= o.length) return o;
|
||||
return hashq(fmt.substr(0,fmt.length-o.length)) + o;
|
||||
}
|
||||
if((r = fmt.match(/^([#0]+)\.([#0]+)$/))) {
|
||||
o = "" + val.toFixed(Math.min(r[2].length,10)).replace(/([^0])0+$/,"$1");
|
||||
ri = o.indexOf(".");
|
||||
var lres = fmt.indexOf(".") - ri, rres = fmt.length - o.length - lres;
|
||||
return hashq(fmt.substr(0,lres) + o + fmt.substr(fmt.length-rres));
|
||||
}
|
||||
if((r = fmt.match(/^00,000\.([#0]*0)$/))) {
|
||||
return val < 0 ? "-" + write_num_int(type, fmt, -val) : commaify(""+val).replace(/^\d,\d{3}$/,"0$&").replace(/^\d*$/,function($$) { return "00," + ($$.length < 3 ? pad0(0,3-$$.length) : "") + $$; }) + "." + pad0(0,r[1].length);
|
||||
}
|
||||
switch(fmt) {
|
||||
case "###,###":
|
||||
case "##,###":
|
||||
case "#,###": var x = commaify(""+aval); return x !== "0" ? sign + x : "";
|
||||
default:
|
||||
if(fmt.match(/\.[0#?]*$/)) return write_num_int(type, fmt.slice(0,fmt.lastIndexOf(".")), val) + hashq(fmt.slice(fmt.lastIndexOf(".")));
|
||||
}
|
||||
throw new Error("unsupported format |" + fmt + "|");
|
||||
}
|
||||
return function write_num(type, fmt, val) {
|
||||
return (val|0) === val ? write_num_int(type, fmt, val) : write_num_flt(type, fmt, val);
|
||||
};})();
|
||||
function split_fmt(fmt) {
|
||||
var out = [];
|
||||
var in_str = false/*, cc*/;
|
||||
for(var i = 0, j = 0; i < fmt.length; ++i) switch((/*cc=*/fmt.charCodeAt(i))) {
|
||||
case 34: /* '"' */
|
||||
in_str = !in_str; break;
|
||||
case 95: case 42: case 92: /* '_' '*' '\\' */
|
||||
++i; break;
|
||||
case 59: /* ';' */
|
||||
out[out.length] = fmt.substr(j,i-j);
|
||||
j = i+1;
|
||||
}
|
||||
out[out.length] = fmt.substr(j);
|
||||
if(in_str === true) throw new Error("Format |" + fmt + "| unterminated string ");
|
||||
return out;
|
||||
}
|
||||
SSF._split = split_fmt;
|
||||
var abstime = /\[[HhMmSs\u0E0A\u0E19\u0E17]*\]/;
|
||||
function fmt_is_date(fmt) {
|
||||
var i = 0, /*cc = 0,*/ c = "", o = "";
|
||||
while(i < fmt.length) {
|
||||
switch((c = fmt.charAt(i))) {
|
||||
case 'G': if(isgeneral(fmt, i)) i+= 6; i++; break;
|
||||
case '"': for(;(/*cc=*/fmt.charCodeAt(++i)) !== 34 && i < fmt.length;){/*empty*/} ++i; break;
|
||||
case '\\': i+=2; break;
|
||||
case '_': i+=2; break;
|
||||
case '@': ++i; break;
|
||||
case 'B': case 'b':
|
||||
if(fmt.charAt(i+1) === "1" || fmt.charAt(i+1) === "2") return true;
|
||||
/* falls through */
|
||||
case 'M': case 'D': case 'Y': case 'H': case 'S': case 'E':
|
||||
/* falls through */
|
||||
case 'm': case 'd': case 'y': case 'h': case 's': case 'e': case 'g': return true;
|
||||
case 'A': case 'a': case '上':
|
||||
if(fmt.substr(i, 3).toUpperCase() === "A/P") return true;
|
||||
if(fmt.substr(i, 5).toUpperCase() === "AM/PM") return true;
|
||||
if(fmt.substr(i, 5).toUpperCase() === "上午/下午") return true;
|
||||
++i; break;
|
||||
case '[':
|
||||
o = c;
|
||||
while(fmt.charAt(i++) !== ']' && i < fmt.length) o += fmt.charAt(i);
|
||||
if(o.match(abstime)) return true;
|
||||
break;
|
||||
case '.':
|
||||
/* falls through */
|
||||
case '0': case '#':
|
||||
while(i < fmt.length && ("0#?.,E+-%".indexOf(c=fmt.charAt(++i)) > -1 || (c=='\\' && fmt.charAt(i+1) == "-" && "0#".indexOf(fmt.charAt(i+2))>-1))){/* empty */}
|
||||
break;
|
||||
case '?': while(fmt.charAt(++i) === c){/* empty */} break;
|
||||
case '*': ++i; if(fmt.charAt(i) == ' ' || fmt.charAt(i) == '*') ++i; break;
|
||||
case '(': case ')': ++i; break;
|
||||
case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9':
|
||||
while(i < fmt.length && "0123456789".indexOf(fmt.charAt(++i)) > -1){/* empty */} break;
|
||||
case ' ': ++i; break;
|
||||
default: ++i; break;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
SSF.is_date = fmt_is_date;
|
||||
function eval_fmt(fmt, v, opts, flen) {
|
||||
var out = [], o = "", i = 0, c = "", lst='t', dt, j, cc;
|
||||
var hr='H';
|
||||
/* Tokenize */
|
||||
while(i < fmt.length) {
|
||||
switch((c = fmt.charAt(i))) {
|
||||
case 'G': /* General */
|
||||
if(!isgeneral(fmt, i)) throw new Error('unrecognized character ' + c + ' in ' +fmt);
|
||||
out[out.length] = {t:'G', v:'General'}; i+=7; break;
|
||||
case '"': /* Literal text */
|
||||
for(o="";(cc=fmt.charCodeAt(++i)) !== 34 && i < fmt.length;) o += String.fromCharCode(cc);
|
||||
out[out.length] = {t:'t', v:o}; ++i; break;
|
||||
case '\\': var w = fmt.charAt(++i), t = (w === "(" || w === ")") ? w : 't';
|
||||
out[out.length] = {t:t, v:w}; ++i; break;
|
||||
case '_': out[out.length] = {t:'t', v:" "}; i+=2; break;
|
||||
case '@': /* Text Placeholder */
|
||||
out[out.length] = {t:'T', v:v}; ++i; break;
|
||||
case 'B': case 'b':
|
||||
if(fmt.charAt(i+1) === "1" || fmt.charAt(i+1) === "2") {
|
||||
if(dt==null) { dt=parse_date_code(v, opts, fmt.charAt(i+1) === "2"); if(dt==null) return ""; }
|
||||
out[out.length] = {t:'X', v:fmt.substr(i,2)}; lst = c; i+=2; break;
|
||||
}
|
||||
/* falls through */
|
||||
case 'M': case 'D': case 'Y': case 'H': case 'S': case 'E':
|
||||
c = c.toLowerCase();
|
||||
/* falls through */
|
||||
case 'm': case 'd': case 'y': case 'h': case 's': case 'e': case 'g':
|
||||
if(v < 0) return "";
|
||||
if(dt==null) { dt=parse_date_code(v, opts); if(dt==null) return ""; }
|
||||
o = c; while(++i < fmt.length && fmt.charAt(i).toLowerCase() === c) o+=c;
|
||||
if(c === 'm' && lst.toLowerCase() === 'h') c = 'M';
|
||||
if(c === 'h') c = hr;
|
||||
out[out.length] = {t:c, v:o}; lst = c; break;
|
||||
case 'A': case 'a': case '上':
|
||||
var q={t:c, v:c};
|
||||
if(dt==null) dt=parse_date_code(v, opts);
|
||||
if(fmt.substr(i, 3).toUpperCase() === "A/P") { if(dt!=null) q.v = dt.H >= 12 ? "P" : "A"; q.t = 'T'; hr='h';i+=3;}
|
||||
else if(fmt.substr(i,5).toUpperCase() === "AM/PM") { if(dt!=null) q.v = dt.H >= 12 ? "PM" : "AM"; q.t = 'T'; i+=5; hr='h'; }
|
||||
else if(fmt.substr(i,5).toUpperCase() === "上午/下午") { if(dt!=null) q.v = dt.H >= 12 ? "下午" : "上午"; q.t = 'T'; i+=5; hr='h'; }
|
||||
else { q.t = "t"; ++i; }
|
||||
if(dt==null && q.t === 'T') return "";
|
||||
out[out.length] = q; lst = c; break;
|
||||
case '[':
|
||||
o = c;
|
||||
while(fmt.charAt(i++) !== ']' && i < fmt.length) o += fmt.charAt(i);
|
||||
if(o.slice(-1) !== ']') throw 'unterminated "[" block: |' + o + '|';
|
||||
if(o.match(abstime)) {
|
||||
if(dt==null) { dt=parse_date_code(v, opts); if(dt==null) return ""; }
|
||||
out[out.length] = {t:'Z', v:o.toLowerCase()};
|
||||
lst = o.charAt(1);
|
||||
} else if(o.indexOf("$") > -1) {
|
||||
o = (o.match(/\$([^-\[\]]*)/)||[])[1]||"$";
|
||||
if(!fmt_is_date(fmt)) out[out.length] = {t:'t',v:o};
|
||||
}
|
||||
break;
|
||||
/* Numbers */
|
||||
case '.':
|
||||
if(dt != null) {
|
||||
o = c; while(++i < fmt.length && (c=fmt.charAt(i)) === "0") o += c;
|
||||
out[out.length] = {t:'s', v:o}; break;
|
||||
}
|
||||
/* falls through */
|
||||
case '0': case '#':
|
||||
o = c; while(++i < fmt.length && "0#?.,E+-%".indexOf(c=fmt.charAt(i)) > -1) o += c;
|
||||
out[out.length] = {t:'n', v:o}; break;
|
||||
case '?':
|
||||
o = c; while(fmt.charAt(++i) === c) o+=c;
|
||||
out[out.length] = {t:c, v:o}; lst = c; break;
|
||||
case '*': ++i; if(fmt.charAt(i) == ' ' || fmt.charAt(i) == '*') ++i; break; // **
|
||||
case '(': case ')': out[out.length] = {t:(flen===1?'t':c), v:c}; ++i; break;
|
||||
case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9':
|
||||
o = c; while(i < fmt.length && "0123456789".indexOf(fmt.charAt(++i)) > -1) o+=fmt.charAt(i);
|
||||
out[out.length] = {t:'D', v:o}; break;
|
||||
case ' ': out[out.length] = {t:c, v:c}; ++i; break;
|
||||
case '$': out[out.length] = {t:'t', v:'$'}; ++i; break;
|
||||
default:
|
||||
if(",$-+/():!^&'~{}<>=€acfijklopqrtuvwxzP".indexOf(c) === -1) throw new Error('unrecognized character ' + c + ' in ' + fmt);
|
||||
out[out.length] = {t:'t', v:c}; ++i; break;
|
||||
}
|
||||
}
|
||||
|
||||
/* Scan for date/time parts */
|
||||
var bt = 0, ss0 = 0, ssm;
|
||||
for(i=out.length-1, lst='t'; i >= 0; --i) {
|
||||
switch(out[i].t) {
|
||||
case 'h': case 'H': out[i].t = hr; lst='h'; if(bt < 1) bt = 1; break;
|
||||
case 's':
|
||||
if((ssm=out[i].v.match(/\.0+$/))) ss0=Math.max(ss0,ssm[0].length-1);
|
||||
if(bt < 3) bt = 3;
|
||||
/* falls through */
|
||||
case 'd': case 'y': case 'M': case 'e': lst=out[i].t; break;
|
||||
case 'm': if(lst === 's') { out[i].t = 'M'; if(bt < 2) bt = 2; } break;
|
||||
case 'X': /*if(out[i].v === "B2");*/
|
||||
break;
|
||||
case 'Z':
|
||||
if(bt < 1 && out[i].v.match(/[Hh]/)) bt = 1;
|
||||
if(bt < 2 && out[i].v.match(/[Mm]/)) bt = 2;
|
||||
if(bt < 3 && out[i].v.match(/[Ss]/)) bt = 3;
|
||||
}
|
||||
}
|
||||
/* time rounding depends on presence of minute / second / usec fields */
|
||||
switch(bt) {
|
||||
case 0: break;
|
||||
case 1:
|
||||
if(dt.u >= 0.5) { dt.u = 0; ++dt.S; }
|
||||
if(dt.S >= 60) { dt.S = 0; ++dt.M; }
|
||||
if(dt.M >= 60) { dt.M = 0; ++dt.H; }
|
||||
break;
|
||||
case 2:
|
||||
if(dt.u >= 0.5) { dt.u = 0; ++dt.S; }
|
||||
if(dt.S >= 60) { dt.S = 0; ++dt.M; }
|
||||
break;
|
||||
}
|
||||
|
||||
/* replace fields */
|
||||
var nstr = "", jj;
|
||||
for(i=0; i < out.length; ++i) {
|
||||
switch(out[i].t) {
|
||||
case 't': case 'T': case ' ': case 'D': break;
|
||||
case 'X': out[i].v = ""; out[i].t = ";"; break;
|
||||
case 'd': case 'm': case 'y': case 'h': case 'H': case 'M': case 's': case 'e': case 'b': case 'Z':
|
||||
out[i].v = write_date(out[i].t.charCodeAt(0), out[i].v, dt, ss0);
|
||||
out[i].t = 't'; break;
|
||||
case 'n': case '?':
|
||||
jj = i+1;
|
||||
while(out[jj] != null && (
|
||||
(c=out[jj].t) === "?" || c === "D" ||
|
||||
((c === " " || c === "t") && out[jj+1] != null && (out[jj+1].t === '?' || out[jj+1].t === "t" && out[jj+1].v === '/')) ||
|
||||
(out[i].t === '(' && (c === ' ' || c === 'n' || c === ')')) ||
|
||||
(c === 't' && (out[jj].v === '/' || out[jj].v === ' ' && out[jj+1] != null && out[jj+1].t == '?'))
|
||||
)) {
|
||||
out[i].v += out[jj].v;
|
||||
out[jj] = {v:"", t:";"}; ++jj;
|
||||
}
|
||||
nstr += out[i].v;
|
||||
i = jj-1; break;
|
||||
case 'G': out[i].t = 't'; out[i].v = general_fmt(v,opts); break;
|
||||
}
|
||||
}
|
||||
var vv = "", myv, ostr;
|
||||
if(nstr.length > 0) {
|
||||
if(nstr.charCodeAt(0) == 40) /* '(' */ {
|
||||
myv = (v<0&&nstr.charCodeAt(0) === 45 ? -v : v);
|
||||
ostr = write_num('n', nstr, myv);
|
||||
} else {
|
||||
myv = (v<0 && flen > 1 ? -v : v);
|
||||
ostr = write_num('n', nstr, myv);
|
||||
if(myv < 0 && out[0] && out[0].t == 't') {
|
||||
ostr = ostr.substr(1);
|
||||
out[0].v = "-" + out[0].v;
|
||||
}
|
||||
}
|
||||
jj=ostr.length-1;
|
||||
var decpt = out.length;
|
||||
for(i=0; i < out.length; ++i) if(out[i] != null && out[i].t != 't' && out[i].v.indexOf(".") > -1) { decpt = i; break; }
|
||||
var lasti=out.length;
|
||||
if(decpt === out.length && ostr.indexOf("E") === -1) {
|
||||
for(i=out.length-1; i>= 0;--i) {
|
||||
if(out[i] == null || 'n?'.indexOf(out[i].t) === -1) continue;
|
||||
if(jj>=out[i].v.length-1) { jj -= out[i].v.length; out[i].v = ostr.substr(jj+1, out[i].v.length); }
|
||||
else if(jj < 0) out[i].v = "";
|
||||
else { out[i].v = ostr.substr(0, jj+1); jj = -1; }
|
||||
out[i].t = 't';
|
||||
lasti = i;
|
||||
}
|
||||
if(jj>=0 && lasti<out.length) out[lasti].v = ostr.substr(0,jj+1) + out[lasti].v;
|
||||
}
|
||||
else if(decpt !== out.length && ostr.indexOf("E") === -1) {
|
||||
jj = ostr.indexOf(".")-1;
|
||||
for(i=decpt; i>= 0; --i) {
|
||||
if(out[i] == null || 'n?'.indexOf(out[i].t) === -1) continue;
|
||||
j=out[i].v.indexOf(".")>-1&&i===decpt?out[i].v.indexOf(".")-1:out[i].v.length-1;
|
||||
vv = out[i].v.substr(j+1);
|
||||
for(; j>=0; --j) {
|
||||
if(jj>=0 && (out[i].v.charAt(j) === "0" || out[i].v.charAt(j) === "#")) vv = ostr.charAt(jj--) + vv;
|
||||
}
|
||||
out[i].v = vv;
|
||||
out[i].t = 't';
|
||||
lasti = i;
|
||||
}
|
||||
if(jj>=0 && lasti<out.length) out[lasti].v = ostr.substr(0,jj+1) + out[lasti].v;
|
||||
jj = ostr.indexOf(".")+1;
|
||||
for(i=decpt; i<out.length; ++i) {
|
||||
if(out[i] == null || ('n?('.indexOf(out[i].t) === -1 && i !== decpt)) continue;
|
||||
j=out[i].v.indexOf(".")>-1&&i===decpt?out[i].v.indexOf(".")+1:0;
|
||||
vv = out[i].v.substr(0,j);
|
||||
for(; j<out[i].v.length; ++j) {
|
||||
if(jj<ostr.length) vv += ostr.charAt(jj++);
|
||||
}
|
||||
out[i].v = vv;
|
||||
out[i].t = 't';
|
||||
lasti = i;
|
||||
}
|
||||
}
|
||||
}
|
||||
for(i=0; i<out.length; ++i) if(out[i] != null && 'n?'.indexOf(out[i].t)>-1) {
|
||||
myv = (flen >1 && v < 0 && i>0 && out[i-1].v === "-" ? -v:v);
|
||||
out[i].v = write_num(out[i].t, out[i].v, myv);
|
||||
out[i].t = 't';
|
||||
}
|
||||
var retval = "";
|
||||
for(i=0; i !== out.length; ++i) if(out[i] != null) retval += out[i].v;
|
||||
return retval;
|
||||
}
|
||||
SSF._eval = eval_fmt;
|
||||
var cfregex = /\[[=<>]/;
|
||||
var cfregex2 = /\[(=|>[=]?|<[>=]?)(-?\d+(?:\.\d*)?)\]/;
|
||||
function chkcond(v, rr) {
|
||||
if(rr == null) return false;
|
||||
var thresh = parseFloat(rr[2]);
|
||||
switch(rr[1]) {
|
||||
case "=": if(v == thresh) return true; break;
|
||||
case ">": if(v > thresh) return true; break;
|
||||
case "<": if(v < thresh) return true; break;
|
||||
case "<>": if(v != thresh) return true; break;
|
||||
case ">=": if(v >= thresh) return true; break;
|
||||
case "<=": if(v <= thresh) return true; break;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
function choose_fmt(f, v) {
|
||||
var fmt = split_fmt(f);
|
||||
var l = fmt.length, lat = fmt[l-1].indexOf("@");
|
||||
if(l<4 && lat>-1) --l;
|
||||
if(fmt.length > 4) throw new Error("cannot find right format for |" + fmt.join("|") + "|");
|
||||
if(typeof v !== "number") return [4, fmt.length === 4 || lat>-1?fmt[fmt.length-1]:"@"];
|
||||
switch(fmt.length) {
|
||||
case 1: fmt = lat>-1 ? ["General", "General", "General", fmt[0]] : [fmt[0], fmt[0], fmt[0], "@"]; break;
|
||||
case 2: fmt = lat>-1 ? [fmt[0], fmt[0], fmt[0], fmt[1]] : [fmt[0], fmt[1], fmt[0], "@"]; break;
|
||||
case 3: fmt = lat>-1 ? [fmt[0], fmt[1], fmt[0], fmt[2]] : [fmt[0], fmt[1], fmt[2], "@"]; break;
|
||||
case 4: break;
|
||||
}
|
||||
var ff = v > 0 ? fmt[0] : v < 0 ? fmt[1] : fmt[2];
|
||||
if(fmt[0].indexOf("[") === -1 && fmt[1].indexOf("[") === -1) return [l, ff];
|
||||
if(fmt[0].match(cfregex) != null || fmt[1].match(cfregex) != null) {
|
||||
var m1 = fmt[0].match(cfregex2);
|
||||
var m2 = fmt[1].match(cfregex2);
|
||||
return chkcond(v, m1) ? [l, fmt[0]] : chkcond(v, m2) ? [l, fmt[1]] : [l, fmt[m1 != null && m2 != null ? 2 : 1]];
|
||||
}
|
||||
return [l, ff];
|
||||
}
|
||||
function format(fmt,v,o) {
|
||||
if(o == null) o = {};
|
||||
var sfmt = "";
|
||||
switch(typeof fmt) {
|
||||
case "string":
|
||||
if(fmt == "m/d/yy" && o.dateNF) sfmt = o.dateNF;
|
||||
else sfmt = fmt;
|
||||
break;
|
||||
case "number":
|
||||
if(fmt == 14 && o.dateNF) sfmt = o.dateNF;
|
||||
else sfmt = (o.table != null ? (o.table) : table_fmt)[fmt];
|
||||
if(sfmt == null) sfmt = (o.table && o.table[default_map[fmt]]) || table_fmt[default_map[fmt]];
|
||||
if(sfmt == null) sfmt = default_str[fmt] || "General";
|
||||
break;
|
||||
}
|
||||
if(isgeneral(sfmt,0)) return general_fmt(v, o);
|
||||
if(v instanceof Date) v = datenum_local(v, o.date1904);
|
||||
var f = choose_fmt(sfmt, v);
|
||||
if(isgeneral(f[1])) return general_fmt(v, o);
|
||||
if(v === true) v = "TRUE"; else if(v === false) v = "FALSE";
|
||||
else if(v === "" || v == null) return "";
|
||||
return eval_fmt(f[1], v, o, f[0]);
|
||||
}
|
||||
function load_entry(fmt, idx) {
|
||||
if(typeof idx != 'number') {
|
||||
idx = +idx || -1;
|
||||
for(var i = 0; i < 0x0188; ++i) {
|
||||
if(table_fmt[i] == undefined) { if(idx < 0) idx = i; continue; }
|
||||
if(table_fmt[i] == fmt) { idx = i; break; }
|
||||
}
|
||||
if(idx < 0) idx = 0x187;
|
||||
}
|
||||
table_fmt[idx] = fmt;
|
||||
return idx;
|
||||
}
|
||||
SSF.load = load_entry;
|
||||
SSF._table = table_fmt;
|
||||
SSF.get_table = function get_table() { return table_fmt; };
|
||||
SSF.load_table = function load_table(tbl) {
|
||||
for(var i=0; i!=0x0188; ++i)
|
||||
if(tbl[i] !== undefined) load_entry(tbl[i], i);
|
||||
};
|
||||
SSF.init_table = init_table;
|
||||
SSF.format = format;
|
||||
};
|
||||
make_ssf(SSF);
|
||||
/*global module */
|
||||
if(typeof module !== 'undefined' && typeof DO_NOT_EXPORT_SSF === 'undefined') module.exports = SSF;
|
1507
packages/ssf/ssf.md
Normal file
1507
packages/ssf/ssf.md
Normal file
File diff suppressed because it is too large
Load Diff
1048576
packages/ssf/test/cal.tsv
Normal file
1048576
packages/ssf/test/cal.tsv
Normal file
File diff suppressed because it is too large
Load Diff
21
packages/ssf/test/comma.js
Normal file
21
packages/ssf/test/comma.js
Normal file
@ -0,0 +1,21 @@
|
||||
/* vim: set ts=2: */
|
||||
/*jshint loopfunc:true, mocha:true, node:true */
|
||||
var SSF = require('../');
|
||||
var fs = require('fs');
|
||||
var data = fs.readFileSync('./test/comma.tsv','utf8').split("\n");
|
||||
|
||||
function doit(w, headers) {
|
||||
it(headers[w], function() {
|
||||
for(var j=1;j<data.length;++j) {
|
||||
if(!data[j]) continue;
|
||||
var d = data[j].replace(/#{255}/g,"").split("\t");
|
||||
var expected = d[w].replace("|", ""), actual;
|
||||
try { actual = SSF.format(headers[w], Number(d[0]), {}); } catch(e) { }
|
||||
if(actual != expected && d[w][0] !== "|") throw new Error([actual, expected, w, headers[w],d[0],d].join("|"));
|
||||
}
|
||||
});
|
||||
}
|
||||
describe('comma formats', function() {
|
||||
var headers = data[0].split("\t");
|
||||
for(var w = 1; w < headers.length; ++w) doit(w, headers);
|
||||
});
|
16
packages/ssf/test/comma.tsv
Normal file
16
packages/ssf/test/comma.tsv
Normal file
@ -0,0 +1,16 @@
|
||||
value #.0000,,, #.0000,, #.0000, #,##0.0 ###,##0 ###,### #,###.00
|
||||
0.99 .0000 .0000 .0010 1.0 1 1 .99
|
||||
1.2345 .0000 .0000 .0012 1.2 1 1 1.23
|
||||
12.345 .0000 .0000 .0123 12.3 12 12 12.35
|
||||
123.456 .0000 .0001 .1235 123.5 123 123 123.46
|
||||
1234 .0000 .0012 1.2340 1,234.0 1,234 1,234 1,234.00
|
||||
12345 .0000 .0123 12.3450 12,345.0 12,345 12,345 12,345.00
|
||||
123456 .0001 .1235 123.4560 123,456.0 123,456 123,456 123,456.00
|
||||
1234567 .0012 1.2346 1234.5670 1,234,567.0 1,234,567 1,234,567 1,234,567.00
|
||||
12345678 .0123 12.3457 12345.6780 12,345,678.0 12,345,678 12,345,678 12,345,678.00
|
||||
123456789 .1235 123.4568 123456.7890 123,456,789.0 123,456,789 123,456,789 123,456,789.00
|
||||
1234567890 1.2346 1234.5679 1234567.8900 1,234,567,890.0 1,234,567,890 1,234,567,890 1,234,567,890.00
|
||||
12345678901 12.3457 12345.6789 12345678.9010 12,345,678,901.0 12,345,678,901 12,345,678,901 12,345,678,901.00
|
||||
123456789012 123.4568 123456.7890 123456789.0120 123,456,789,012.0 123,456,789,012 123,456,789,012 123,456,789,012.00
|
||||
4321 .0000 .0043 4.3210 4,321.0 4,321 4,321 4,321.00
|
||||
4321234 .0043 4.3212 4321.2340 4,321,234.0 4,321,234 4,321,234 4,321,234.00
|
|
38
packages/ssf/test/date.js
Normal file
38
packages/ssf/test/date.js
Normal file
@ -0,0 +1,38 @@
|
||||
/* vim: set ts=2: */
|
||||
/*jshint -W041 */
|
||||
/*jshint loopfunc:true, mocha:true, node:true */
|
||||
var SSF = require('../');
|
||||
var fs = require('fs'), assert = require('assert');
|
||||
var dates = fs.readFileSync('./test/dates.tsv','utf8').split("\n");
|
||||
var date2 = fs.readFileSync('./test/cal.tsv', 'utf8').split("\n");
|
||||
var times = fs.readFileSync('./test/times.tsv','utf8').split("\n");
|
||||
function doit(data) {
|
||||
var step = Math.ceil(data.length/100), i = 1;
|
||||
var headers = data[0].split("\t");
|
||||
for(var j = 0; j <= 100; ++j) it(String(j), function() {
|
||||
for(var k = 0; k <= step; ++k,++i) {
|
||||
if(data[i] == null || data[i].length < 3) return;
|
||||
var d = data[i].replace(/#{255}/g,"").split("\t");
|
||||
for(var w = 1; w < headers.length; ++w) {
|
||||
var expected = d[w], actual = SSF.format(headers[w], parseFloat(d[0]), {});
|
||||
if(actual != expected) throw new Error([actual, expected, w, headers[w],d[0],d,i].join("|"));
|
||||
actual = SSF.format(headers[w].toUpperCase(), parseFloat(d[0]), {});
|
||||
if(actual != expected) throw new Error([actual, expected, w, headers[w].toUpperCase(),d[0],d,i].join("|"));
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
describe('time formats', function() {
|
||||
doit(process.env.MINTEST ? times.slice(0,4000) : times);
|
||||
});
|
||||
|
||||
describe('date formats', function() {
|
||||
doit(process.env.MINTEST ? dates.slice(0,4000) : dates);
|
||||
if(0) doit(process.env.MINTEST ? date2.slice(0,1000) : date2);
|
||||
it('should fail for bad formats', function() {
|
||||
var bad = [];
|
||||
var chk = function(fmt){ return function(){ SSF.format(fmt,0); }; };
|
||||
bad.forEach(function(fmt){assert.throws(chk(fmt));});
|
||||
});
|
||||
});
|
22
packages/ssf/test/date.json
Normal file
22
packages/ssf/test/date.json
Normal file
@ -0,0 +1,22 @@
|
||||
[
|
||||
["new Date(1900,0,1)", "1900-01-01 00:00:00", false],
|
||||
["new Date(1900,1,1)", "1900-02-01 00:00:00", false],
|
||||
["new Date(1900,2,1)", "1900-03-01 00:00:00", false],
|
||||
["new Date(1900,3,1)", "1900-04-01 00:00:00", false],
|
||||
["new Date(2000,0,1)", "2000-01-01 00:00:00", false],
|
||||
["new Date(2000,1,1)", "2000-02-01 00:00:00", false],
|
||||
["new Date(2000,2,1)", "2000-03-01 00:00:00", false],
|
||||
["new Date(2000,3,1)", "2000-04-01 00:00:00", false],
|
||||
["new Date(2000,0,1)", "2000-01-01 00:00:00", true],
|
||||
["new Date(2000,1,3)", "2000-02-03 00:00:00", true],
|
||||
["new Date(2000,2,5)", "2000-03-05 00:00:00", true],
|
||||
["new Date(2000,3,7)", "2000-04-07 00:00:00", true],
|
||||
["new Date(2100,0,1)", "2100-01-01 00:00:00", false],
|
||||
["new Date(2100,1,1)", "2100-02-01 00:00:00", false],
|
||||
["new Date(2100,2,1)", "2100-03-01 00:00:00", false],
|
||||
["new Date(2100,3,1)", "2100-04-01 00:00:00", false],
|
||||
["new Date(2100,0,1)", "2100-01-01 00:00:00", true],
|
||||
["new Date(2100,1,3)", "2100-02-03 00:00:00", true],
|
||||
["new Date(2100,2,5)", "2100-03-05 00:00:00", true],
|
||||
["new Date(2100,3,7)", "2100-04-07 00:00:00", true]
|
||||
]
|
50
packages/ssf/test/dateNF.js
Normal file
50
packages/ssf/test/dateNF.js
Normal file
@ -0,0 +1,50 @@
|
||||
/* vim: set ts=2: */
|
||||
/*jshint loopfunc:true, mocha:true, node:true */
|
||||
/*eslint-env mocha, node */
|
||||
var SSF = require('../');
|
||||
var assert = require('assert');
|
||||
describe('dateNF override', function() {
|
||||
it('should override format code 14', function() {
|
||||
assert.equal(SSF.format(14, 43880), "2/19/20");
|
||||
assert.equal(SSF.format(14, 43880, {dateNF:"yyyy-mm-dd"}), "2020-02-19");
|
||||
assert.equal(SSF.format(14, 43880, {dateNF:"dd/mm/yyyy"}), "19/02/2020");
|
||||
});
|
||||
it('should override format "m/d/yy"', function() {
|
||||
assert.equal(SSF.format('m/d/yy', 43880), "2/19/20");
|
||||
assert.equal(SSF.format('m/d/yy', 43880, {dateNF:"yyyy-mm-dd"}), "2020-02-19");
|
||||
assert.equal(SSF.format('m/d/yy', 43880, {dateNF:"dd/mm/yyyy"}), "19/02/2020");
|
||||
});
|
||||
});
|
||||
describe('asian formats', function() {
|
||||
it('上午/下午 (AM/PM)', function() {
|
||||
assert.equal(SSF.format('上午/下午', 0), '上午');
|
||||
assert.equal(SSF.format('上午/下午', 0.25), '上午');
|
||||
assert.equal(SSF.format('上午/下午', 0.49), '上午');
|
||||
assert.equal(SSF.format('上午/下午', 0.5), '下午');
|
||||
assert.equal(SSF.format('上午/下午', 0.51), '下午');
|
||||
assert.equal(SSF.format('上午/下午', 0.99), '下午');
|
||||
assert.equal(SSF.format('上午/下午', 1), '上午');
|
||||
});
|
||||
it('bb (buddhist)', function() {
|
||||
[
|
||||
[12345,
|
||||
[ 'yyyy', '1933'],
|
||||
[ 'eeee', '1933'],
|
||||
[ 'bbbb', '2476'],
|
||||
//[ 'ปปปป', '๒๔๗๖'],
|
||||
[ 'b2yyyy', '1352'],
|
||||
[ 'b2eeee', '1352'],
|
||||
[ 'b2bbbb', '1895'],
|
||||
//[ 'b2ปปปป', '๑๘๙๕']
|
||||
]
|
||||
].forEach(function(row) {
|
||||
row.slice(1).forEach(function(fmt) {
|
||||
assert.equal(SSF.format(fmt[0], row[0]), fmt[1]);
|
||||
});
|
||||
});
|
||||
});
|
||||
it.skip('thai fields', function() {
|
||||
SSF.format('\u0E27/\u0E14/\u0E1B\u0E1B\u0E1B\u0E1B \u0E0A\u0E0A:\u0E19\u0E19:\u0E17\u0E17', 12345.67);
|
||||
assert.equal(SSF.format('\u0E27/\u0E14/\u0E1B\u0E1B\u0E1B\u0E1B \u0E0A\u0E0A:\u0E19\u0E19:\u0E17\u0E17', 12345.67), "๑๘/๑๐/๒๔๗๖ ๑๖:๐๔:๔๘");
|
||||
});
|
||||
});
|
12
packages/ssf/test/dates.js
Normal file
12
packages/ssf/test/dates.js
Normal file
@ -0,0 +1,12 @@
|
||||
/* vim: set ts=2: */
|
||||
/*jshint -W041 */
|
||||
/*jshint loopfunc:true, mocha:true, node:true, evil:true */
|
||||
var SSF = require('../');
|
||||
var fs = require('fs'), assert = require('assert');
|
||||
var data = JSON.parse(fs.readFileSync('./test/date.json','utf8'));
|
||||
|
||||
describe('date values', function() {
|
||||
it('should roundtrip dates', function() { data.forEach(function(d) {
|
||||
assert.equal(SSF.format("yyyy-mm-dd HH:MM:SS", eval(d[0]), {date1904:!!d[2]}), d[1]);
|
||||
}); });
|
||||
});
|
295849
packages/ssf/test/dates.tsv
Normal file
295849
packages/ssf/test/dates.tsv
Normal file
File diff suppressed because it is too large
Load Diff
21
packages/ssf/test/exp.js
Normal file
21
packages/ssf/test/exp.js
Normal file
@ -0,0 +1,21 @@
|
||||
/* vim: set ts=2: */
|
||||
/*jshint loopfunc:true, mocha:true, node:true */
|
||||
var SSF = require('../');
|
||||
var fs = require('fs');
|
||||
var data = fs.readFileSync('./test/exp.tsv','utf8').split("\n");
|
||||
function doit(d, headers) {
|
||||
it(d[0], function() {
|
||||
for(var w = 1; w < headers.length; ++w) {
|
||||
var expected = d[w].replace("|", ""), actual;
|
||||
try { actual = SSF.format(headers[w], parseFloat(d[0]), {}); } catch(e) { }
|
||||
if(actual != expected && d[w].charAt(0) !== "|") throw new Error([actual, expected, w, headers[w],d[0],d].join("|"));
|
||||
}
|
||||
});
|
||||
}
|
||||
describe('exponential formats', function() {
|
||||
var headers = data[0].split("\t");
|
||||
for(var j=1;j<data.length;++j) {
|
||||
if(!data[j]) return;
|
||||
doit(data[j].replace(/#{255}/g,"").split("\t"), headers);
|
||||
}
|
||||
});
|
46
packages/ssf/test/exp.tsv
Normal file
46
packages/ssf/test/exp.tsv
Normal file
@ -0,0 +1,46 @@
|
||||
value #0.0E+0 ##0.0E+0 ###0.0E+0 ####0.0E+0
|
||||
1.23457E-13 12.3E-14 123.5E-15 1234.6E-16 123.5E-15
|
||||
1.23457E-12 1.2E-12 1.2E-12 1.2E-12 1234.6E-15
|
||||
1.23457E-11 12.3E-12 12.3E-12 12.3E-12 12345.7E-15
|
||||
1.23457E-10 1.2E-10 123.5E-12 123.5E-12 1.2E-10
|
||||
1.23457E-09 12.3E-10 1.2E-9 1234.6E-12 12.3E-10
|
||||
1.23457E-08 1.2E-8 12.3E-9 1.2E-8 123.5E-10
|
||||
0.000000123457 12.3E-8 123.5E-9 12.3E-8 1234.6E-10
|
||||
0.00000123457 1.2E-6 1.2E-6 123.5E-8 12345.7E-10
|
||||
0.0000123457 12.3E-6 12.3E-6 1234.6E-8 1.2E-5
|
||||
0.000123457 1.2E-4 123.5E-6 1.2E-4 12.3E-5
|
||||
0.001234568 12.3E-4 1.2E-3 12.3E-4 123.5E-5
|
||||
0.012345679 1.2E-2 12.3E-3 123.5E-4 1234.6E-5
|
||||
0.123456789 12.3E-2 123.5E-3 1234.6E-4 12345.7E-5
|
||||
1.23456789 1.2E+0 1.2E+0 1.2E+0 1.2E+0
|
||||
12.3456789 12.3E+0 12.3E+0 12.3E+0 12.3E+0
|
||||
123.456789 1.2E+2 123.5E+0 123.5E+0 123.5E+0
|
||||
1234.56789 |12.3E+2 1.2E+3 1234.6E+0 1234.6E+0
|
||||
12345.6789 1.2E+4 12.3E+3 1.2E+4 12345.7E+0
|
||||
123456.789 12.3E+4 123.5E+3 12.3E+4 1.2E+5
|
||||
1234567.89 1.2E+6 1.2E+6 123.5E+4 12.3E+5
|
||||
12345678.9 12.3E+6 12.3E+6 |1234.6E+4 123.5E+5
|
||||
123456789 1.2E+8 123.5E+6 1.2E+8 1234.6E+5
|
||||
1234567890 12.3E+8 1.2E+9 12.3E+8 |12345.7E+5
|
||||
12345678900 1.2E+10 12.3E+9 123.5E+8 1.2E+10
|
||||
123456789000 12.3E+10 123.5E+9 1234.6E+8 12.3E+10
|
||||
1234567890000 1.2E+12 1.2E+12 1.2E+12 123.5E+10
|
||||
12345678900000 12.3E+12 12.3E+12 12.3E+12 1234.6E+10
|
||||
123456789000000 1.2E+14 123.5E+12 123.5E+12 12345.7E+10
|
||||
1234567890000000 12.3E+14 1.2E+15 1234.6E+12 1.2E+15
|
||||
12345678900000000 1.2E+16 12.3E+15 1.2E+16 12.3E+15
|
||||
123456789000000000 12.3E+16 123.5E+15 12.3E+16 123.5E+15
|
||||
1234567890000000000 1.2E+18 1.2E+18 123.5E+16 1234.6E+15
|
||||
12345678900000000000 12.3E+18 12.3E+18 1234.6E+16 12345.7E+15
|
||||
123456789000000000000 1.2E+20 123.5E+18 1.2E+20 1.2E+20
|
||||
1234567890000000000000 12.3E+20 1.2E+21 12.3E+20 12.3E+20
|
||||
12345678900000000000000 1.2E+22 12.3E+21 123.5E+20 123.5E+20
|
||||
123456789000000000000000 12.3E+22 123.5E+21 1234.6E+20 1234.6E+20
|
||||
1234567890000000000000000 1.2E+24 1.2E+24 1.2E+24 12345.7E+20
|
||||
12345678900000000000000000 12.3E+24 12.3E+24 12.3E+24 1.2E+25
|
||||
123456789000000000000000000 1.2E+26 123.5E+24 123.5E+24 12.3E+25
|
||||
1234567890000000000000000000 12.3E+26 1.2E+27 1234.6E+24 123.5E+25
|
||||
12345678900000000000000000000 1.2E+28 12.3E+27 1.2E+28 1234.6E+25
|
||||
123456789000000000000000000000 12.3E+28 123.5E+27 12.3E+28 12345.7E+25
|
||||
1234567890000000000000000000000 1.2E+30 1.2E+30 123.5E+28 1.2E+30
|
||||
12345678900000000000000000000000 12.3E+30 12.3E+30 1234.6E+28 12.3E+30
|
|
15
packages/ssf/test/fraction.js
Normal file
15
packages/ssf/test/fraction.js
Normal file
@ -0,0 +1,15 @@
|
||||
/* vim: set ts=2: */
|
||||
/*jshint loopfunc:true, mocha:true, node:true */
|
||||
var SSF = require('../');
|
||||
var fs = require('fs'), assert = require('assert');
|
||||
var data = JSON.parse(fs.readFileSync('./test/fraction.json','utf8'));
|
||||
var skip = [];
|
||||
describe('fractional formats', function() {
|
||||
data.forEach(function(d) {
|
||||
it(d[1]+" for "+d[0], skip.indexOf(d[1]) > -1 ? null : function(){
|
||||
var expected = d[2], actual = SSF.format(d[1], d[0], {});
|
||||
//var r = actual.match(/(-?)\d* *\d+\/\d+/);
|
||||
assert.equal(actual, expected);
|
||||
});
|
||||
});
|
||||
});
|
121
packages/ssf/test/fraction.json
Normal file
121
packages/ssf/test/fraction.json
Normal file
@ -0,0 +1,121 @@
|
||||
[
|
||||
[1, "# ?/?", "1 "],
|
||||
[-1.2, "# ?/?", "-1 1/5"],
|
||||
[12.3, "# ?/?", "12 1/3"],
|
||||
[-12.34, "# ?/?", "-12 1/3"],
|
||||
[123.45, "# ?/?", "123 4/9"],
|
||||
[-123.456, "# ?/?", "-123 1/2"],
|
||||
[1234.567, "# ?/?", "1234 4/7"],
|
||||
[-1234.5678, "# ?/?", "-1234 4/7"],
|
||||
[12345.6789, "# ?/?", "12345 2/3"],
|
||||
[-12345.67891, "# ?/?", "-12345 2/3"],
|
||||
|
||||
[1, "# ??/??", "1 "],
|
||||
[-1.2, "# ??/??", "-1 1/5 "],
|
||||
[12.3, "# ??/??", "12 3/10"],
|
||||
[-12.34, "# ??/??", "-12 17/50"],
|
||||
[123.45, "# ??/??", "123 9/20"],
|
||||
[-123.456, "# ??/??", "-123 26/57"],
|
||||
[1234.567, "# ??/??", "1234 55/97"],
|
||||
[-1234.5678, "# ??/??", "-1234 46/81"],
|
||||
[12345.6789, "# ??/??", "12345 55/81"],
|
||||
[-12345.67891, "# ??/??", "-12345 55/81"],
|
||||
|
||||
[1, "# ???/???", "1 "],
|
||||
[-1.2, "# ???/???", "-1 1/5 "],
|
||||
[12.3, "# ???/???", "12 3/10 "],
|
||||
[-12.34, "# ???/???", "-12 17/50 "],
|
||||
[123.45, "# ???/???", "123 9/20 "],
|
||||
[-123.456, "# ???/???", "-123 57/125"],
|
||||
[1234.567, "# ???/???", "1234 55/97 "],
|
||||
[-1234.5678, "# ???/???", "-1234 67/118"],
|
||||
[12345.6789, "# ???/???", "12345 74/109"],
|
||||
[-12345.67891, "# ???/???", "-12345 573/844"],
|
||||
|
||||
|
||||
[1, "# ?/2", "1 "],
|
||||
[-1.2, "# ?/2", "-1 "],
|
||||
[12.3, "# ?/2", "12 1/2"],
|
||||
[-12.34, "# ?/2", "-12 1/2"],
|
||||
[123.45, "# ?/2", "123 1/2"],
|
||||
[-123.456, "# ?/2", "-123 1/2"],
|
||||
[1234.567, "# ?/2", "1234 1/2"],
|
||||
[-1234.5678, "# ?/2", "-1234 1/2"],
|
||||
[12345.6789, "# ?/2", "12345 1/2"],
|
||||
[-12345.67891, "# ?/2", "-12345 1/2"],
|
||||
|
||||
[1, "# ?/4", "1 "],
|
||||
[-1.2, "# ?/4", "-1 1/4"],
|
||||
[12.3, "# ?/4", "12 1/4"],
|
||||
[-12.34, "# ?/4", "-12 1/4"],
|
||||
[123.45, "# ?/4", "123 2/4"],
|
||||
[-123.456, "# ?/4", "-123 2/4"],
|
||||
[1234.567, "# ?/4", "1234 2/4"],
|
||||
[-1234.5678, "# ?/4", "-1234 2/4"],
|
||||
[12345.6789, "# ?/4", "12345 3/4"],
|
||||
[-12345.67891, "# ?/4", "-12345 3/4"],
|
||||
|
||||
[1, "# ?/8", "1 "],
|
||||
[-1.2, "# ?/8", "-1 2/8"],
|
||||
[12.3, "# ?/8", "12 2/8"],
|
||||
[-12.34, "# ?/8", "-12 3/8"],
|
||||
[123.45, "# ?/8", "123 4/8"],
|
||||
[-123.456, "# ?/8", "-123 4/8"],
|
||||
[1234.567, "# ?/8", "1234 5/8"],
|
||||
[-1234.5678, "# ?/8", "-1234 5/8"],
|
||||
[12345.6789, "# ?/8", "12345 5/8"],
|
||||
[-12345.67891, "# ?/8", "-12345 5/8"],
|
||||
|
||||
[1, "# ??/16", "1 "],
|
||||
[-1.2, "# ??/16", "-1 3/16"],
|
||||
[12.3, "# ??/16", "12 5/16"],
|
||||
[-12.34, "# ??/16", "-12 5/16"],
|
||||
[123.45, "# ??/16", "123 7/16"],
|
||||
[-123.456, "# ??/16", "-123 7/16"],
|
||||
[1234.567, "# ??/16", "1234 9/16"],
|
||||
[-1234.5678, "# ??/16", "-1234 9/16"],
|
||||
[12345.6789, "# ??/16", "12345 11/16"],
|
||||
[-12345.67891, "# ??/16", "-12345 11/16"],
|
||||
|
||||
[1, "# ?/10", "1 "],
|
||||
[-1.2, "# ?/10", "-1 2/10"],
|
||||
[12.3, "# ?/10", "12 3/10"],
|
||||
[-12.34, "# ?/10", "-12 3/10"],
|
||||
[123.45, "# ?/10", "123 5/10"],
|
||||
[-123.456, "# ?/10", "-123 5/10"],
|
||||
[1234.567, "# ?/10", "1234 6/10"],
|
||||
[-1234.5678, "# ?/10", "-1234 6/10"],
|
||||
[12345.6789, "# ?/10", "12345 7/10"],
|
||||
[-12345.67891, "# ?/10", "-12345 7/10"],
|
||||
|
||||
[1, "# ??/100", "1 "],
|
||||
[-1.2, "# ??/100", "-1 20/100"],
|
||||
[12.3, "# ??/100", "12 30/100"],
|
||||
[-12.34, "# ??/100", "-12 34/100"],
|
||||
[123.45, "# ??/100", "123 45/100"],
|
||||
[-123.456, "# ??/100", "-123 46/100"],
|
||||
[1234.567, "# ??/100", "1234 57/100"],
|
||||
[-1234.5678, "# ??/100", "-1234 57/100"],
|
||||
[12345.6789, "# ??/100", "12345 68/100"],
|
||||
[-12345.67891, "# ??/100", "-12345 68/100"],
|
||||
|
||||
[1, "??/??", " 1/1 "],
|
||||
[-1.2, "??/??", "- 6/5 "],
|
||||
[12.3, "??/??", "123/10"],
|
||||
[-12.34, "??/??", "-617/50"],
|
||||
[123.45, "??/??", "2469/20"],
|
||||
[-123.456, "??/??", "-7037/57"],
|
||||
[1234.567, "??/??", "119753/97"],
|
||||
[-1234.5678, "??/??", "-100000/81"],
|
||||
[12345.6789, "??/??", "1000000/81"],
|
||||
[-12345.67891, "??/??", "-1000000/81"],
|
||||
|
||||
[0.3, "# ?/?", " 2/7"],
|
||||
[1.3, "# ?/?", "1 1/3"],
|
||||
[2.3, "# ?/?", "2 2/7"],
|
||||
|
||||
[0.123251512342345, "# ??/?????????", " 480894/3901729"],
|
||||
[0.123251512342345, "# ?? / ?????????", " 480894 / 3901729"],
|
||||
|
||||
[0, "0", "0"]
|
||||
]
|
26
packages/ssf/test/general.js
Normal file
26
packages/ssf/test/general.js
Normal file
@ -0,0 +1,26 @@
|
||||
/* vim: set ts=2: */
|
||||
/*jshint loopfunc:true, mocha:true, node:true */
|
||||
var SSF = require('../');
|
||||
var fs = require('fs'), assert = require('assert');
|
||||
var data = JSON.parse(fs.readFileSync('./test/general.json','utf8'));
|
||||
var skip = [];
|
||||
describe('General format', function() {
|
||||
data.forEach(function(d) {
|
||||
it(d[1]+" for "+d[0], skip.indexOf(d[1]) > -1 ? null : function(){
|
||||
assert.equal(SSF.format(d[1], d[0], {}), d[2]);
|
||||
});
|
||||
});
|
||||
it('should handle special values', function() {
|
||||
assert.equal(SSF.format("General", true), "TRUE");
|
||||
assert.equal(SSF.format("General", undefined), "");
|
||||
assert.equal(SSF.format("General", null), "");
|
||||
});
|
||||
it('should handle dates', function() {
|
||||
assert.equal(SSF.format("General", new Date(2017, 1, 19)), "2/19/17");
|
||||
assert.equal(SSF.format("General", new Date(2017, 1, 19), {date1904:true}), "2/19/17");
|
||||
assert.equal(SSF.format("General", new Date(1901, 0, 1)), "1/1/01");
|
||||
if(SSF.format("General", new Date(1901, 0, 1), {date1904:true}) == "1/1/01") throw new Error("date1904 invalid date");
|
||||
assert.equal(SSF.format("General", new Date(1904, 0, 1)), "1/1/04");
|
||||
assert.equal(SSF.format("General", new Date(1904, 0, 1), {date1904:true}), "1/1/04");
|
||||
});
|
||||
});
|
516
packages/ssf/test/general.json
Normal file
516
packages/ssf/test/general.json
Normal file
@ -0,0 +1,516 @@
|
||||
[
|
||||
[1.234567E-14, 0, "1.23457E-14"],
|
||||
[1.234567E-13, 0, "1.23457E-13"],
|
||||
[1.234567E-12, 0, "1.23457E-12"],
|
||||
[1.234567E-11, 0, "1.23457E-11"],
|
||||
[1.234567E-10, 0, "1.23457E-10"],
|
||||
[1.234567E-9, 0, "1.23457E-09"],
|
||||
[1.234567E-8, 0, "1.23457E-08"],
|
||||
[1.234567E-7, 0, "1.23457E-07"],
|
||||
[1.234567E-6, 0, "1.23457E-06"],
|
||||
[1.234567E-5, 0, "1.23457E-05"],
|
||||
[1.234567E-4, 0, "0.000123457"],
|
||||
[1.234567E-3, 0, "0.001234567"],
|
||||
[1.234567E-2, 0, "0.01234567"],
|
||||
[1.234567E-1, 0, "0.1234567"],
|
||||
[1.234567E0, 0, "1.234567"],
|
||||
[1.234567E1, 0, "12.34567"],
|
||||
[1.234567E2, 0, "123.4567"],
|
||||
[1.234567E3, 0, "1234.567"],
|
||||
[1.234567E4, 0, "12345.67"],
|
||||
[1.234567E5, 0, "123456.7"],
|
||||
[1.234567E6, 0, "1234567"],
|
||||
[1.234567E7, 0, "12345670"],
|
||||
[1.234567E8, 0, "123456700"],
|
||||
[1.234567E9, 0, "1234567000"],
|
||||
[1.234567E10, 0, "12345670000"],
|
||||
[1.234567E11, 0, "1.23457E+11"],
|
||||
[1.234567E12, 0, "1.23457E+12"],
|
||||
[1.234567E13, 0, "1.23457E+13"],
|
||||
[1.234567E14, 0, "1.23457E+14"],
|
||||
|
||||
[0.00000000000001, 0, "1E-14"],
|
||||
[0.0000000000001, 0, "1E-13"],
|
||||
[0.000000000001, 0, "1E-12"],
|
||||
[0.00000000001, 0, "1E-11"],
|
||||
[0.0000000001, 0, "1E-10"],
|
||||
[0.000000001, 0, "0.000000001"],
|
||||
[0.00000001, 0, "0.00000001"],
|
||||
[0.0000001, 0, "0.0000001"],
|
||||
[0.000001, 0, "0.000001"],
|
||||
[0.00001, 0, "0.00001"],
|
||||
[0.0001, 0, "0.0001"],
|
||||
[0.001, 0, "0.001"],
|
||||
[0.01, 0, "0.01"],
|
||||
[0.1, 0, "0.1"],
|
||||
[1, 0, "1"],
|
||||
[10, 0, "10"],
|
||||
[100, 0, "100"],
|
||||
[1000, 0, "1000"],
|
||||
[10000, 0, "10000"],
|
||||
[100000, 0, "100000"],
|
||||
[1000000, 0, "1000000"],
|
||||
[10000000, 0, "10000000"],
|
||||
[100000000, 0, "100000000"],
|
||||
[1000000000, 0, "1000000000"],
|
||||
[10000000000, 0, "10000000000"],
|
||||
[100000000000, 0, "1E+11"],
|
||||
[1000000000000, 0, "1E+12"],
|
||||
[10000000000000, 0, "1E+13"],
|
||||
[100000000000000, 0, "1E+14"],
|
||||
|
||||
[0.000000000000012, 0, "1.2E-14"],
|
||||
[0.00000000000012, 0, "1.2E-13"],
|
||||
[0.0000000000012, 0, "1.2E-12"],
|
||||
[0.000000000012, 0, "1.2E-11"],
|
||||
[0.00000000012, 0, "1.2E-10"],
|
||||
[0.0000000012, 0, "1.2E-09"],
|
||||
[0.000000012, 0, "0.000000012"],
|
||||
[0.00000012, 0, "0.00000012"],
|
||||
[0.0000012, 0, "0.0000012"],
|
||||
[0.000012, 0, "0.000012"],
|
||||
[0.00012, 0, "0.00012"],
|
||||
[0.0012, 0, "0.0012"],
|
||||
[0.012, 0, "0.012"],
|
||||
[0.12, 0, "0.12"],
|
||||
[1.2, 0, "1.2"],
|
||||
[12, 0, "12"],
|
||||
[120, 0, "120"],
|
||||
[1200, 0, "1200"],
|
||||
[12000, 0, "12000"],
|
||||
[120000, 0, "120000"],
|
||||
[1200000, 0, "1200000"],
|
||||
[12000000, 0, "12000000"],
|
||||
[120000000, 0, "120000000"],
|
||||
[1200000000, 0, "1200000000"],
|
||||
[12000000000, 0, "12000000000"],
|
||||
[120000000000, 0, "1.2E+11"],
|
||||
[1200000000000, 0, "1.2E+12"],
|
||||
[12000000000000, 0, "1.2E+13"],
|
||||
[120000000000000, 0, "1.2E+14"],
|
||||
|
||||
[0.0000000000000123, 0, "1.23E-14"],
|
||||
[0.000000000000123, 0, "1.23E-13"],
|
||||
[0.00000000000123, 0, "1.23E-12"],
|
||||
[0.0000000000123, 0, "1.23E-11"],
|
||||
[0.000000000123, 0, "1.23E-10"],
|
||||
[0.00000000123, 0, "1.23E-09"],
|
||||
[0.0000000123, 0, "1.23E-08"],
|
||||
[0.000000123, 0, "0.000000123"],
|
||||
[0.00000123, 0, "0.00000123"],
|
||||
[0.0000123, 0, "0.0000123"],
|
||||
[0.000123, 0, "0.000123"],
|
||||
[0.00123, 0, "0.00123"],
|
||||
[0.0123, 0, "0.0123"],
|
||||
[0.123, 0, "0.123"],
|
||||
[1.23, 0, "1.23"],
|
||||
[12.3, 0, "12.3"],
|
||||
[123, 0, "123"],
|
||||
[1230, 0, "1230"],
|
||||
[12300, 0, "12300"],
|
||||
[123000, 0, "123000"],
|
||||
[1230000, 0, "1230000"],
|
||||
[12300000, 0, "12300000"],
|
||||
[123000000, 0, "123000000"],
|
||||
[1230000000, 0, "1230000000"],
|
||||
[12300000000, 0, "12300000000"],
|
||||
[123000000000, 0, "1.23E+11"],
|
||||
[1230000000000, 0, "1.23E+12"],
|
||||
[12300000000000, 0, "1.23E+13"],
|
||||
[123000000000000, 0, "1.23E+14"],
|
||||
|
||||
[0.00000000000001234, 0, "1.234E-14"],
|
||||
[0.0000000000001234, 0, "1.234E-13"],
|
||||
[0.000000000001234, 0, "1.234E-12"],
|
||||
[0.00000000001234, 0, "1.234E-11"],
|
||||
[0.0000000001234, 0, "1.234E-10"],
|
||||
[0.000000001234, 0, "1.234E-09"],
|
||||
[0.00000001234, 0, "1.234E-08"],
|
||||
[0.0000001234, 0, "1.234E-07"],
|
||||
[0.000001234, 0, "0.000001234"],
|
||||
[0.00001234, 0, "0.00001234"],
|
||||
[0.0001234, 0, "0.0001234"],
|
||||
[0.001234, 0, "0.001234"],
|
||||
[0.01234, 0, "0.01234"],
|
||||
[0.1234, 0, "0.1234"],
|
||||
[1.234, 0, "1.234"],
|
||||
[12.34, 0, "12.34"],
|
||||
[123.4, 0, "123.4"],
|
||||
[1234, 0, "1234"],
|
||||
[12340, 0, "12340"],
|
||||
[123400, 0, "123400"],
|
||||
[1234000, 0, "1234000"],
|
||||
[12340000, 0, "12340000"],
|
||||
[123400000, 0, "123400000"],
|
||||
[1234000000, 0, "1234000000"],
|
||||
[12340000000, 0, "12340000000"],
|
||||
[123400000000, 0, "1.234E+11"],
|
||||
[1234000000000, 0, "1.234E+12"],
|
||||
[12340000000000, 0, "1.234E+13"],
|
||||
[123400000000000, 0, "1.234E+14"],
|
||||
|
||||
[0.000000000000012345, 0, "1.2345E-14"],
|
||||
[0.00000000000012345, 0, "1.2345E-13"],
|
||||
[0.0000000000012345, 0, "1.2345E-12"],
|
||||
[0.000000000012345, 0, "1.2345E-11"],
|
||||
[0.00000000012345, 0, "1.2345E-10"],
|
||||
[0.0000000012345, 0, "1.2345E-09"],
|
||||
[0.000000012345, 0, "1.2345E-08"],
|
||||
[0.00000012345, 0, "1.2345E-07"],
|
||||
[0.0000012345, 0, "1.2345E-06"],
|
||||
[0.000012345, 0, "0.000012345"],
|
||||
[0.00012345, 0, "0.00012345"],
|
||||
[0.0012345, 0, "0.0012345"],
|
||||
[0.012345, 0, "0.012345"],
|
||||
[0.12345, 0, "0.12345"],
|
||||
[1.2345, 0, "1.2345"],
|
||||
[12.345, 0, "12.345"],
|
||||
[123.45, 0, "123.45"],
|
||||
[1234.5, 0, "1234.5"],
|
||||
[12345, 0, "12345"],
|
||||
[123450, 0, "123450"],
|
||||
[1234500, 0, "1234500"],
|
||||
[12345000, 0, "12345000"],
|
||||
[123450000, 0, "123450000"],
|
||||
[1234500000, 0, "1234500000"],
|
||||
[12345000000, 0, "12345000000"],
|
||||
[123450000000, 0, "1.2345E+11"],
|
||||
[1234500000000, 0, "1.2345E+12"],
|
||||
[12345000000000, 0, "1.2345E+13"],
|
||||
[123450000000000, 0, "1.2345E+14"],
|
||||
|
||||
[0.0000000000000123456, 0, "1.23456E-14"],
|
||||
[0.000000000000123456, 0, "1.23456E-13"],
|
||||
[0.00000000000123456, 0, "1.23456E-12"],
|
||||
[0.0000000000123456, 0, "1.23456E-11"],
|
||||
[0.000000000123456, 0, "1.23456E-10"],
|
||||
[0.00000000123456, 0, "1.23456E-09"],
|
||||
[0.0000000123456, 0, "1.23456E-08"],
|
||||
[0.000000123456, 0, "1.23456E-07"],
|
||||
[0.00000123456, 0, "1.23456E-06"],
|
||||
[0.0000123456, 0, "1.23456E-05"],
|
||||
[0.000123456, 0, "0.000123456"],
|
||||
[0.00123456, 0, "0.00123456"],
|
||||
[0.0123456, 0, "0.0123456"],
|
||||
[0.123456, 0, "0.123456"],
|
||||
[1.23456, 0, "1.23456"],
|
||||
[12.3456, 0, "12.3456"],
|
||||
[123.456, 0, "123.456"],
|
||||
[1234.56, 0, "1234.56"],
|
||||
[12345.6, 0, "12345.6"],
|
||||
[123456, 0, "123456"],
|
||||
[1234560, 0, "1234560"],
|
||||
[12345600, 0, "12345600"],
|
||||
[123456000, 0, "123456000"],
|
||||
[1234560000, 0, "1234560000"],
|
||||
[12345600000, 0, "12345600000"],
|
||||
[123456000000, 0, "1.23456E+11"],
|
||||
[1234560000000, 0, "1.23456E+12"],
|
||||
[12345600000000, 0, "1.23456E+13"],
|
||||
[123456000000000, 0, "1.23456E+14"],
|
||||
|
||||
[0.00000000000001234567, 0, "1.23457E-14"],
|
||||
[0.0000000000001234567, 0, "1.23457E-13"],
|
||||
[0.000000000001234567, 0, "1.23457E-12"],
|
||||
[0.00000000001234567, 0, "1.23457E-11"],
|
||||
[0.0000000001234567, 0, "1.23457E-10"],
|
||||
[0.000000001234567, 0, "1.23457E-09"],
|
||||
[0.00000001234567, 0, "1.23457E-08"],
|
||||
[0.0000001234567, 0, "1.23457E-07"],
|
||||
[0.000001234567, 0, "1.23457E-06"],
|
||||
[0.00001234567, 0, "1.23457E-05"],
|
||||
[0.0001234567, 0, "0.000123457"],
|
||||
[0.001234567, 0, "0.001234567"],
|
||||
[0.01234567, 0, "0.01234567"],
|
||||
[0.1234567, 0, "0.1234567"],
|
||||
[1.234567, 0, "1.234567"],
|
||||
[12.34567, 0, "12.34567"],
|
||||
[123.4567, 0, "123.4567"],
|
||||
[1234.567, 0, "1234.567"],
|
||||
[12345.67, 0, "12345.67"],
|
||||
[123456.7, 0, "123456.7"],
|
||||
[1234567, 0, "1234567"],
|
||||
[12345670, 0, "12345670"],
|
||||
[123456700, 0, "123456700"],
|
||||
[1234567000, 0, "1234567000"],
|
||||
[12345670000, 0, "12345670000"],
|
||||
[123456700000, 0, "1.23457E+11"],
|
||||
[1234567000000, 0, "1.23457E+12"],
|
||||
[12345670000000, 0, "1.23457E+13"],
|
||||
[123456700000000, 0, "1.23457E+14"],
|
||||
|
||||
[0.000000000000012345678, 0, "1.23457E-14"],
|
||||
[0.00000000000012345678, 0, "1.23457E-13"],
|
||||
[0.0000000000012345678, 0, "1.23457E-12"],
|
||||
[0.000000000012345678, 0, "1.23457E-11"],
|
||||
[0.00000000012345678, 0, "1.23457E-10"],
|
||||
[0.0000000012345678, 0, "1.23457E-09"],
|
||||
[0.000000012345678, 0, "1.23457E-08"],
|
||||
[0.00000012345678, 0, "1.23457E-07"],
|
||||
[0.0000012345678, 0, "1.23457E-06"],
|
||||
[0.000012345678, 0, "1.23457E-05"],
|
||||
[0.00012345678, 0, "0.000123457"],
|
||||
[0.0012345678, 0, "0.001234568"],
|
||||
[0.012345678, 0, "0.012345678"],
|
||||
[0.12345678, 0, "0.12345678"],
|
||||
[1.2345678, 0, "1.2345678"],
|
||||
[12.345678, 0, "12.345678"],
|
||||
[123.45678, 0, "123.45678"],
|
||||
[1234.5678, 0, "1234.5678"],
|
||||
[12345.678, 0, "12345.678"],
|
||||
[123456.78, 0, "123456.78"],
|
||||
[1234567.8, 0, "1234567.8"],
|
||||
[12345678, 0, "12345678"],
|
||||
[123456780, 0, "123456780"],
|
||||
[1234567800, 0, "1234567800"],
|
||||
[12345678000, 0, "12345678000"],
|
||||
[123456780000, 0, "1.23457E+11"],
|
||||
[1234567800000, 0, "1.23457E+12"],
|
||||
[12345678000000, 0, "1.23457E+13"],
|
||||
[123456780000000, 0, "1.23457E+14"],
|
||||
|
||||
[0.0000000000000123456789, 0, "1.23457E-14"],
|
||||
[0.000000000000123456789, 0, "1.23457E-13"],
|
||||
[0.00000000000123456789, 0, "1.23457E-12"],
|
||||
[0.0000000000123456789, 0, "1.23457E-11"],
|
||||
[0.000000000123456789, 0, "1.23457E-10"],
|
||||
[0.00000000123456789, 0, "1.23457E-09"],
|
||||
[0.0000000123456789, 0, "1.23457E-08"],
|
||||
[0.000000123456789, 0, "1.23457E-07"],
|
||||
[0.00000123456789, 0, "1.23457E-06"],
|
||||
[0.0000123456789, 0, "1.23457E-05"],
|
||||
[0.000123456789, 0, "0.000123457"],
|
||||
[0.00123456789, 0, "0.001234568"],
|
||||
[0.0123456789, 0, "0.012345679"],
|
||||
[0.123456789, 0, "0.123456789"],
|
||||
[1.23456789, 0, "1.23456789"],
|
||||
[12.3456789, 0, "12.3456789"],
|
||||
[123.456789, 0, "123.456789"],
|
||||
[1234.56789, 0, "1234.56789"],
|
||||
[12345.6789, 0, "12345.6789"],
|
||||
[123456.789, 0, "123456.789"],
|
||||
[1234567.89, 0, "1234567.89"],
|
||||
[12345678.9, 0, "12345678.9"],
|
||||
[123456789, 0, "123456789"],
|
||||
[1234567890, 0, "1234567890"],
|
||||
[12345678900, 0, "12345678900"],
|
||||
[123456789000, 0, "1.23457E+11"],
|
||||
[1234567890000, 0, "1.23457E+12"],
|
||||
[12345678900000, 0, "1.23457E+13"],
|
||||
[123456789000000, 0, "1.23457E+14"],
|
||||
|
||||
[0.00000000000001234567891, 0, "1.23457E-14"],
|
||||
[0.0000000000001234567891, 0, "1.23457E-13"],
|
||||
[0.000000000001234567891, 0, "1.23457E-12"],
|
||||
[0.00000000001234567891, 0, "1.23457E-11"],
|
||||
[0.0000000001234567891, 0, "1.23457E-10"],
|
||||
[0.000000001234567891, 0, "1.23457E-09"],
|
||||
[0.00000001234567891, 0, "1.23457E-08"],
|
||||
[0.0000001234567891, 0, "1.23457E-07"],
|
||||
[0.000001234567891, 0, "1.23457E-06"],
|
||||
[0.00001234567891, 0, "1.23457E-05"],
|
||||
[0.0001234567891, 0, "0.000123457"],
|
||||
[0.001234567891, 0, "0.001234568"],
|
||||
[0.01234567891, 0, "0.012345679"],
|
||||
[0.1234567891, 0, "0.123456789"],
|
||||
[1.234567891, 0, "1.234567891"],
|
||||
[12.34567891, 0, "12.34567891"],
|
||||
[123.4567891, 0, "123.4567891"],
|
||||
[1234.567891, 0, "1234.567891"],
|
||||
[12345.67891, 0, "12345.67891"],
|
||||
[123456.7891, 0, "123456.7891"],
|
||||
[1234567.891, 0, "1234567.891"],
|
||||
[12345678.91, 0, "12345678.91"],
|
||||
[123456789.1, 0, "123456789.1"],
|
||||
[1234567891, 0, "1234567891"],
|
||||
[12345678910, 0, "12345678910"],
|
||||
[123456789100, 0, "1.23457E+11"],
|
||||
[1234567891000, 0, "1.23457E+12"],
|
||||
[12345678910000, 0, "1.23457E+13"],
|
||||
[123456789100000, 0, "1.23457E+14"],
|
||||
|
||||
[0.000000000000012345678912, 0, "1.23457E-14"],
|
||||
[0.00000000000012345678912, 0, "1.23457E-13"],
|
||||
[0.0000000000012345678912, 0, "1.23457E-12"],
|
||||
[0.000000000012345678912, 0, "1.23457E-11"],
|
||||
[0.00000000012345678912, 0, "1.23457E-10"],
|
||||
[0.0000000012345678912, 0, "1.23457E-09"],
|
||||
[0.000000012345678912, 0, "1.23457E-08"],
|
||||
[0.00000012345678912, 0, "1.23457E-07"],
|
||||
[0.0000012345678912, 0, "1.23457E-06"],
|
||||
[0.000012345678912, 0, "1.23457E-05"],
|
||||
[0.00012345678912, 0, "0.000123457"],
|
||||
[0.0012345678912, 0, "0.001234568"],
|
||||
[0.012345678912, 0, "0.012345679"],
|
||||
[0.12345678912, 0, "0.123456789"],
|
||||
[1.2345678912, 0, "1.234567891"],
|
||||
[12.345678912, 0, "12.34567891"],
|
||||
[123.45678912, 0, "123.4567891"],
|
||||
[1234.5678912, 0, "1234.567891"],
|
||||
[12345.678912, 0, "12345.67891"],
|
||||
[123456.78912, 0, "123456.7891"],
|
||||
[1234567.8912, 0, "1234567.891"],
|
||||
[12345678.912, 0, "12345678.91"],
|
||||
[123456789.12, 0, "123456789.1"],
|
||||
[1234567891.2, 0, "1234567891"],
|
||||
[12345678912, 0, "12345678912"],
|
||||
[123456789120, 0, "1.23457E+11"],
|
||||
[1234567891200, 0, "1.23457E+12"],
|
||||
[12345678912000, 0, "1.23457E+13"],
|
||||
[123456789120000, 0, "1.23457E+14"],
|
||||
|
||||
[0.0000000000000123456789123, 0, "1.23457E-14"],
|
||||
[0.000000000000123456789123, 0, "1.23457E-13"],
|
||||
[0.00000000000123456789123, 0, "1.23457E-12"],
|
||||
[0.0000000000123456789123, 0, "1.23457E-11"],
|
||||
[0.000000000123456789123, 0, "1.23457E-10"],
|
||||
[0.00000000123456789123, 0, "1.23457E-09"],
|
||||
[0.0000000123456789123, 0, "1.23457E-08"],
|
||||
[0.000000123456789123, 0, "1.23457E-07"],
|
||||
[0.00000123456789123, 0, "1.23457E-06"],
|
||||
[0.0000123456789123, 0, "1.23457E-05"],
|
||||
[0.000123456789123, 0, "0.000123457"],
|
||||
[0.00123456789123, 0, "0.001234568"],
|
||||
[0.0123456789123, 0, "0.012345679"],
|
||||
[0.123456789123, 0, "0.123456789"],
|
||||
[1.23456789123, 0, "1.234567891"],
|
||||
[12.3456789123, 0, "12.34567891"],
|
||||
[123.456789123, 0, "123.4567891"],
|
||||
[1234.56789123, 0, "1234.567891"],
|
||||
[12345.6789123, 0, "12345.67891"],
|
||||
[123456.789123, 0, "123456.7891"],
|
||||
[1234567.89123, 0, "1234567.891"],
|
||||
[12345678.9123, 0, "12345678.91"],
|
||||
[123456789.123, 0, "123456789.1"],
|
||||
[1234567891.23, 0, "1234567891"],
|
||||
[12345678912.3, 0, "12345678912"],
|
||||
[123456789123, 0, "1.23457E+11"],
|
||||
[1234567891230, 0, "1.23457E+12"],
|
||||
[12345678912300, 0, "1.23457E+13"],
|
||||
[123456789123000, 0, "1.23457E+14"],
|
||||
|
||||
[0.00000000000001234567891234, 0, "1.23457E-14"],
|
||||
[0.0000000000001234567891234, 0, "1.23457E-13"],
|
||||
[0.000000000001234567891234, 0, "1.23457E-12"],
|
||||
[0.00000000001234567891234, 0, "1.23457E-11"],
|
||||
[0.0000000001234567891234, 0, "1.23457E-10"],
|
||||
[0.000000001234567891234, 0, "1.23457E-09"],
|
||||
[0.00000001234567891234, 0, "1.23457E-08"],
|
||||
[0.0000001234567891234, 0, "1.23457E-07"],
|
||||
[0.000001234567891234, 0, "1.23457E-06"],
|
||||
[0.00001234567891234, 0, "1.23457E-05"],
|
||||
[0.0001234567891234, 0, "0.000123457"],
|
||||
[0.001234567891234, 0, "0.001234568"],
|
||||
[0.01234567891234, 0, "0.012345679"],
|
||||
[0.1234567891234, 0, "0.123456789"],
|
||||
[1.234567891234, 0, "1.234567891"],
|
||||
[12.34567891234, 0, "12.34567891"],
|
||||
[123.4567891234, 0, "123.4567891"],
|
||||
[1234.567891234, 0, "1234.567891"],
|
||||
[12345.67891234, 0, "12345.67891"],
|
||||
[123456.7891234, 0, "123456.7891"],
|
||||
[1234567.891234, 0, "1234567.891"],
|
||||
[12345678.91234, 0, "12345678.91"],
|
||||
[123456789.1234, 0, "123456789.1"],
|
||||
[1234567891.234, 0, "1234567891"],
|
||||
[12345678912.34, 0, "12345678912"],
|
||||
[123456789123.4, 0, "1.23457E+11"],
|
||||
[1234567891234, 0, "1.23457E+12"],
|
||||
[12345678912340, 0, "1.23457E+13"],
|
||||
[123456789123400, 0, "1.23457E+14"],
|
||||
|
||||
[0.000000000000012345678912345, 0, "1.23457E-14"],
|
||||
[0.00000000000012345678912345, 0, "1.23457E-13"],
|
||||
[0.0000000000012345678912345, 0, "1.23457E-12"],
|
||||
[0.000000000012345678912345, 0, "1.23457E-11"],
|
||||
[0.00000000012345678912345, 0, "1.23457E-10"],
|
||||
[0.0000000012345678912345, 0, "1.23457E-09"],
|
||||
[0.000000012345678912345, 0, "1.23457E-08"],
|
||||
[0.00000012345678912345, 0, "1.23457E-07"],
|
||||
[0.0000012345678912345, 0, "1.23457E-06"],
|
||||
[0.000012345678912345, 0, "1.23457E-05"],
|
||||
[0.00012345678912345, 0, "0.000123457"],
|
||||
[0.0012345678912345, 0, "0.001234568"],
|
||||
[0.012345678912345, 0, "0.012345679"],
|
||||
[0.12345678912345, 0, "0.123456789"],
|
||||
[1.2345678912345, 0, "1.234567891"],
|
||||
[12.345678912345, 0, "12.34567891"],
|
||||
[123.45678912345, 0, "123.4567891"],
|
||||
[1234.5678912345, 0, "1234.567891"],
|
||||
[12345.678912345, 0, "12345.67891"],
|
||||
[123456.78912345, 0, "123456.7891"],
|
||||
[1234567.8912345, 0, "1234567.891"],
|
||||
[12345678.912345, 0, "12345678.91"],
|
||||
[123456789.12345, 0, "123456789.1"],
|
||||
[1234567891.2345, 0, "1234567891"],
|
||||
[12345678912.345, 0, "12345678912"],
|
||||
[123456789123.45, 0, "1.23457E+11"],
|
||||
[1234567891234.5, 0, "1.23457E+12"],
|
||||
[12345678912345, 0, "1.23457E+13"],
|
||||
[123456789123450, 0, "1.23457E+14"],
|
||||
|
||||
[0.0000000000000123456789123456, 0, "1.23457E-14"],
|
||||
[0.000000000000123456789123456, 0, "1.23457E-13"],
|
||||
[0.00000000000123456789123456, 0, "1.23457E-12"],
|
||||
[0.0000000000123456789123456, 0, "1.23457E-11"],
|
||||
[0.000000000123456789123456, 0, "1.23457E-10"],
|
||||
[0.00000000123456789123456, 0, "1.23457E-09"],
|
||||
[0.0000000123456789123456, 0, "1.23457E-08"],
|
||||
[0.000000123456789123456, 0, "1.23457E-07"],
|
||||
[0.00000123456789123456, 0, "1.23457E-06"],
|
||||
[0.0000123456789123456, 0, "1.23457E-05"],
|
||||
[0.000123456789123456, 0, "0.000123457"],
|
||||
[0.00123456789123456, 0, "0.001234568"],
|
||||
[0.0123456789123456, 0, "0.012345679"],
|
||||
[0.123456789123456, 0, "0.123456789"],
|
||||
[1.23456789123456, 0, "1.234567891"],
|
||||
[12.3456789123456, 0, "12.34567891"],
|
||||
[123.456789123456, 0, "123.4567891"],
|
||||
[1234.56789123456, 0, "1234.567891"],
|
||||
[12345.6789123456, 0, "12345.67891"],
|
||||
[123456.789123456, 0, "123456.7891"],
|
||||
[1234567.89123456, 0, "1234567.891"],
|
||||
[12345678.9123456, 0, "12345678.91"],
|
||||
[123456789.123456, 0, "123456789.1"],
|
||||
[1234567891.23456, 0, "1234567891"],
|
||||
[12345678912.3456, 0, "12345678912"],
|
||||
[123456789123.456, 0, "1.23457E+11"],
|
||||
[1234567891234.56, 0, "1.23457E+12"],
|
||||
[12345678912345.6, 0, "1.23457E+13"],
|
||||
[123456789123456, 0, "1.23457E+14"],
|
||||
|
||||
[-0.00000000000001234567, 0, "-1.23457E-14"],
|
||||
[-0.0000000000001234567, 0, "-1.23457E-13"],
|
||||
[-0.000000000001234567, 0, "-1.23457E-12"],
|
||||
[-0.00000000001234567, 0, "-1.23457E-11"],
|
||||
[-0.0000000001234567, 0, "-1.23457E-10"],
|
||||
[-0.000000001234567, 0, "-1.23457E-09"],
|
||||
[-0.00000001234567, 0, "-1.23457E-08"],
|
||||
[-0.0000001234567, 0, "-1.23457E-07"],
|
||||
[-0.000001234567, 0, "-1.23457E-06"],
|
||||
[-0.00001234567, 0, "-1.23457E-05"],
|
||||
[-0.0001234567, 0, "-0.000123457"],
|
||||
[-0.001234567, 0, "-0.001234567"],
|
||||
[-0.01234567, 0, "-0.01234567"],
|
||||
[-0.1234567, 0, "-0.1234567"],
|
||||
[-1.234567, 0, "-1.234567"],
|
||||
[-12.34567, 0, "-12.34567"],
|
||||
[-123.4567, 0, "-123.4567"],
|
||||
[-1234.567, 0, "-1234.567"],
|
||||
[-12345.67, 0, "-12345.67"],
|
||||
[-123456.7, 0, "-123456.7"],
|
||||
[-1234567, 0, "-1234567"],
|
||||
[-12345670, 0, "-12345670"],
|
||||
[-123456700, 0, "-123456700"],
|
||||
[-1234567000, 0, "-1234567000"],
|
||||
[-12345670000, 0, "-12345670000"],
|
||||
[-123456700000, 0, "-1.23457E+11"],
|
||||
[-1234567000000, 0, "-1.23457E+12"],
|
||||
[-12345670000000, 0, "-1.23457E+13"],
|
||||
[-123456700000000, 0, "-1.23457E+14"],
|
||||
|
||||
[true, 0, "TRUE"],
|
||||
[false, 0, "FALSE"],
|
||||
|
||||
["sheetjs", 0, "sheetjs"]
|
||||
]
|
17
packages/ssf/test/implied.js
Normal file
17
packages/ssf/test/implied.js
Normal file
@ -0,0 +1,17 @@
|
||||
/* vim: set ts=2: */
|
||||
/*jshint loopfunc:true, mocha:true, node:true */
|
||||
var SSF = require('../');
|
||||
var fs = require('fs'), assert = require('assert');
|
||||
var data = JSON.parse(fs.readFileSync('./test/implied.json','utf8'));
|
||||
var skip = [];
|
||||
function doit(d) {
|
||||
d[1].forEach(function(r){if(r.length === 2)assert.equal(SSF.format(r[0],d[0]),r[1]);});
|
||||
}
|
||||
describe('implied formats', function() {
|
||||
data.forEach(function(d) {
|
||||
if(d.length == 2) it(String(d[0]), function() { doit(d); });
|
||||
else it(d[1]+" for "+d[0], skip.indexOf(d[1]) > -1 ? null : function(){
|
||||
assert.equal(SSF.format(d[1], d[0], {}), d[2]);
|
||||
});
|
||||
});
|
||||
});
|
756
packages/ssf/test/implied.json
Normal file
756
packages/ssf/test/implied.json
Normal file
@ -0,0 +1,756 @@
|
||||
[
|
||||
[1234567890000, [
|
||||
[0, "1.23457E+12"],
|
||||
[1, "1234567890000"],
|
||||
[2, "1234567890000.00"],
|
||||
[3, "1,234,567,890,000"],
|
||||
[4, "1,234,567,890,000.00"],
|
||||
[9, "123456789000000%"],
|
||||
[10, "123456789000000.00%"],
|
||||
[11, "1.23E+12"],
|
||||
[12, "1234567890000 "],
|
||||
[13, "1234567890000 "],
|
||||
[14, ""],
|
||||
[15, ""],
|
||||
[16, ""],
|
||||
[17, ""],
|
||||
[18, ""],
|
||||
[19, ""],
|
||||
[20, ""],
|
||||
[21, ""],
|
||||
[22, ""],
|
||||
[37, "1,234,567,890,000 "],
|
||||
[38, "1,234,567,890,000 "],
|
||||
[39, "1,234,567,890,000.00"],
|
||||
[40, "1,234,567,890,000.00"],
|
||||
[45, ""],
|
||||
[46, ""],
|
||||
[47, ""],
|
||||
[48, "1.2E+12"],
|
||||
[49, "1.23457E+12"]
|
||||
]],
|
||||
|
||||
[123456789000, [
|
||||
[0, "1.23457E+11"],
|
||||
[1, "123456789000"],
|
||||
[2, "123456789000.00"],
|
||||
[3, "123,456,789,000"],
|
||||
[4, "123,456,789,000.00"],
|
||||
[9, "12345678900000%"],
|
||||
[10, "12345678900000.00%"],
|
||||
[11, "1.23E+11"],
|
||||
[12, "123456789000 "],
|
||||
[13, "123456789000 "],
|
||||
[14, ""],
|
||||
[15, ""],
|
||||
[16, ""],
|
||||
[17, ""],
|
||||
[18, ""],
|
||||
[19, ""],
|
||||
[20, ""],
|
||||
[21, ""],
|
||||
[22, ""],
|
||||
[37, "123,456,789,000 "],
|
||||
[38, "123,456,789,000 "],
|
||||
[39, "123,456,789,000.00"],
|
||||
[40, "123,456,789,000.00"],
|
||||
[45, ""],
|
||||
[46, ""],
|
||||
[47, ""],
|
||||
[48, "123.5E+9"],
|
||||
[49, "1.23457E+11"]
|
||||
]],
|
||||
|
||||
[12345678900, [
|
||||
[0, "12345678900"],
|
||||
[1, "12345678900"],
|
||||
[2, "12345678900.00"],
|
||||
[3, "12,345,678,900"],
|
||||
[4, "12,345,678,900.00"],
|
||||
[9, "1234567890000%"],
|
||||
[10, "1234567890000.00%"],
|
||||
[11, "1.23E+10"],
|
||||
[12, "12345678900 "],
|
||||
[13, "12345678900 "],
|
||||
[14, ""],
|
||||
[15, ""],
|
||||
[16, ""],
|
||||
[17, ""],
|
||||
[18, ""],
|
||||
[19, ""],
|
||||
[20, ""],
|
||||
[21, ""],
|
||||
[22, ""],
|
||||
[37, "12,345,678,900 "],
|
||||
[38, "12,345,678,900 "],
|
||||
[39, "12,345,678,900.00"],
|
||||
[40, "12,345,678,900.00"],
|
||||
[45, ""],
|
||||
[46, ""],
|
||||
[47, ""],
|
||||
[48, "12.3E+9"],
|
||||
[49, "12345678900"]
|
||||
]],
|
||||
|
||||
[1234567890, [
|
||||
[0, "1234567890"],
|
||||
[1, "1234567890"],
|
||||
[2, "1234567890.00"],
|
||||
[3, "1,234,567,890"],
|
||||
[4, "1,234,567,890.00"],
|
||||
[9, "123456789000%"],
|
||||
[10, "123456789000.00%"],
|
||||
[11, "1.23E+09"],
|
||||
[12, "1234567890 "],
|
||||
[13, "1234567890 "],
|
||||
[14, ""],
|
||||
[15, ""],
|
||||
[16, ""],
|
||||
[17, ""],
|
||||
[18, ""],
|
||||
[19, ""],
|
||||
[20, ""],
|
||||
[21, ""],
|
||||
[22, ""],
|
||||
[37, "1,234,567,890 "],
|
||||
[38, "1,234,567,890 "],
|
||||
[39, "1,234,567,890.00"],
|
||||
[40, "1,234,567,890.00"],
|
||||
[45, ""],
|
||||
[46, ""],
|
||||
[47, ""],
|
||||
[48, "1.2E+9"],
|
||||
[49, "1234567890"]
|
||||
]],
|
||||
|
||||
[123456789, [
|
||||
[0, "123456789"],
|
||||
[1, "123456789"],
|
||||
[2, "123456789.00"],
|
||||
[3, "123,456,789"],
|
||||
[4, "123,456,789.00"],
|
||||
[9, "12345678900%"],
|
||||
[10, "12345678900.00%"],
|
||||
[11, "1.23E+08"],
|
||||
[12, "123456789 "],
|
||||
[13, "123456789 "],
|
||||
[14, ""],
|
||||
[15, ""],
|
||||
[16, ""],
|
||||
[17, ""],
|
||||
[18, ""],
|
||||
[19, ""],
|
||||
[20, ""],
|
||||
[21, ""],
|
||||
[22, ""],
|
||||
[37, "123,456,789 "],
|
||||
[38, "123,456,789 "],
|
||||
[39, "123,456,789.00"],
|
||||
[40, "123,456,789.00"],
|
||||
[45, ""],
|
||||
[46, ""],
|
||||
[47, ""],
|
||||
[48, "123.5E+6"],
|
||||
[49, "123456789"]
|
||||
]],
|
||||
|
||||
[12345678.9, [
|
||||
[0, "12345678.9"],
|
||||
[1, "12345679"],
|
||||
[2, "12345678.90"],
|
||||
[3, "12,345,679"],
|
||||
[4, "12,345,678.90"],
|
||||
[9, "1234567890%"],
|
||||
[10, "1234567890.00%"],
|
||||
[11, "1.23E+07"],
|
||||
[12, "12345679 "],
|
||||
[13, "12345678 9/10"],
|
||||
[14, ""],
|
||||
[15, ""],
|
||||
[16, ""],
|
||||
[17, ""],
|
||||
[18, ""],
|
||||
[19, ""],
|
||||
[20, ""],
|
||||
[21, ""],
|
||||
[22, ""],
|
||||
[37, "12,345,679 "],
|
||||
[38, "12,345,679 "],
|
||||
[39, "12,345,678.90"],
|
||||
[40, "12,345,678.90"],
|
||||
[45, ""],
|
||||
[46, ""],
|
||||
[47, ""],
|
||||
[48, "12.3E+6"],
|
||||
[49, "12345678.9"]
|
||||
]],
|
||||
|
||||
[1234567.89, [
|
||||
[0, "1234567.89"],
|
||||
[1, "1234568"],
|
||||
[2, "1234567.89"],
|
||||
[3, "1,234,568"],
|
||||
[4, "1,234,567.89"],
|
||||
[9, "123456789%"],
|
||||
[10, "123456789.00%"],
|
||||
[11, "1.23E+06"],
|
||||
[12, "1234567 8/9"],
|
||||
[13, "1234567 8/9 "],
|
||||
[14, "2/15/80"],
|
||||
[15, "15-Feb-80"],
|
||||
[16, "15-Feb"],
|
||||
[17, "Feb-80"],
|
||||
[18, "9:21 PM"],
|
||||
[19, "9:21:36 PM"],
|
||||
[20, "21:21"],
|
||||
[21, "21:21:36"],
|
||||
[22, "2/15/80 21:21"],
|
||||
[37, "1,234,568 "],
|
||||
[38, "1,234,568 "],
|
||||
[39, "1,234,567.89"],
|
||||
[40, "1,234,567.89"],
|
||||
[45, "21:36"],
|
||||
[46, "29629629:21:36"],
|
||||
[47, "2136.0"],
|
||||
[48, "1.2E+6"],
|
||||
[49, "1234567.89"]
|
||||
]],
|
||||
|
||||
[123456.789, [
|
||||
[0, "123456.789"],
|
||||
[1, "123457"],
|
||||
[2, "123456.79"],
|
||||
[3, "123,457"],
|
||||
[4, "123,456.79"],
|
||||
[9, "12345679%"],
|
||||
[10, "12345678.90%"],
|
||||
[11, "1.23E+05"],
|
||||
[12, "123456 4/5"],
|
||||
[13, "123456 15/19"],
|
||||
[14, "1/3/38"],
|
||||
[15, "3-Jan-38"],
|
||||
[16, "3-Jan"],
|
||||
[17, "Jan-38"],
|
||||
[18, "6:56 PM"],
|
||||
[19, "6:56:10 PM"],
|
||||
[20, "18:56"],
|
||||
[21, "18:56:10"],
|
||||
[22, "1/3/38 18:56"],
|
||||
[37, "123,457 "],
|
||||
[38, "123,457 "],
|
||||
[39, "123,456.79"],
|
||||
[40, "123,456.79"],
|
||||
[45, "56:10"],
|
||||
[46, "2962962:56:10"],
|
||||
[47, "5609.6"],
|
||||
[48, "123.5E+3"],
|
||||
[49, "123456.789"]
|
||||
]],
|
||||
|
||||
[12345.6789, [
|
||||
[0, "12345.6789"],
|
||||
[1, "12346"],
|
||||
[2, "12345.68"],
|
||||
[3, "12,346"],
|
||||
[4, "12,345.68"],
|
||||
[9, "1234568%"],
|
||||
[10, "1234567.89%"],
|
||||
[11, "1.23E+04"],
|
||||
[12, "12345 2/3"],
|
||||
[13, "12345 55/81"],
|
||||
[14, "10/18/33"],
|
||||
[15, "18-Oct-33"],
|
||||
[16, "18-Oct"],
|
||||
[17, "Oct-33"],
|
||||
[18, "4:17 PM"],
|
||||
[19, "4:17:37 PM"],
|
||||
[20, "16:17"],
|
||||
[21, "16:17:37"],
|
||||
[22, "10/18/33 16:17"],
|
||||
[37, "12,346 "],
|
||||
[38, "12,346 "],
|
||||
[39, "12,345.68"],
|
||||
[40, "12,345.68"],
|
||||
[45, "17:37"],
|
||||
[46, "296296:17:37"],
|
||||
[47, "1737.0"],
|
||||
[48, "12.3E+3"],
|
||||
[49, "12345.6789"]
|
||||
]],
|
||||
|
||||
[1234.56789, [
|
||||
[0, "1234.56789"],
|
||||
[1, "1235"],
|
||||
[2, "1234.57"],
|
||||
[3, "1,235"],
|
||||
[4, "1,234.57"],
|
||||
[9, "123457%"],
|
||||
[10, "123456.79%"],
|
||||
[11, "1.23E+03"],
|
||||
[12, "1234 4/7"],
|
||||
[13, "1234 46/81"],
|
||||
[14, "5/18/03"],
|
||||
[15, "18-May-03"],
|
||||
[16, "18-May"],
|
||||
[17, "May-03"],
|
||||
[18, "1:37 PM"],
|
||||
[19, "1:37:46 PM"],
|
||||
[20, "13:37"],
|
||||
[21, "13:37:46"],
|
||||
[22, "5/18/03 13:37"],
|
||||
[37, "1,235 "],
|
||||
[38, "1,235 "],
|
||||
[39, "1,234.57"],
|
||||
[40, "1,234.57"],
|
||||
[45, "37:46"],
|
||||
[46, "29629:37:46"],
|
||||
[47, "3745.7"],
|
||||
[48, "1.2E+3"],
|
||||
[49, "1234.56789"]
|
||||
]],
|
||||
|
||||
[123.456789, [
|
||||
[0, "123.456789"],
|
||||
[1, "123"],
|
||||
[2, "123.46"],
|
||||
[3, "123"],
|
||||
[4, "123.46"],
|
||||
[9, "12346%"],
|
||||
[10, "12345.68%"],
|
||||
[11, "1.23E+02"],
|
||||
[12, "123 1/2"],
|
||||
[13, "123 37/81"],
|
||||
[14, "5/2/00"],
|
||||
[15, "2-May-00"],
|
||||
[16, "2-May"],
|
||||
[17, "May-00"],
|
||||
[18, "10:57 AM"],
|
||||
[19, "10:57:47 AM"],
|
||||
[20, "10:57"],
|
||||
[21, "10:57:47"],
|
||||
[22, "5/2/00 10:57"],
|
||||
[37, "123 "],
|
||||
[38, "123 "],
|
||||
[39, "123.46"],
|
||||
[40, "123.46"],
|
||||
[45, "57:47"],
|
||||
[46, "2962:57:47"],
|
||||
[47, "5746.6"],
|
||||
[48, "123.5E+0"],
|
||||
[49, "123.456789"]
|
||||
]],
|
||||
|
||||
[12.3456789, [
|
||||
[0, "12.3456789"],
|
||||
[1, "12"],
|
||||
[2, "12.35"],
|
||||
[3, "12"],
|
||||
[4, "12.35"],
|
||||
[9, "1235%"],
|
||||
[10, "1234.57%"],
|
||||
[11, "1.23E+01"],
|
||||
[12, "12 1/3"],
|
||||
[13, "12 28/81"],
|
||||
[14, "1/12/00"],
|
||||
[15, "12-Jan-00"],
|
||||
[16, "12-Jan"],
|
||||
[17, "Jan-00"],
|
||||
[18, "8:17 AM"],
|
||||
[19, "8:17:47 AM"],
|
||||
[20, "8:17"],
|
||||
[21, "8:17:47"],
|
||||
[22, "1/12/00 8:17"],
|
||||
[37, "12 "],
|
||||
[38, "12 "],
|
||||
[39, "12.35"],
|
||||
[40, "12.35"],
|
||||
[45, "17:47"],
|
||||
[46, "296:17:47"],
|
||||
[47, "1746.7"],
|
||||
[48, "12.3E+0"],
|
||||
[49, "12.3456789"]
|
||||
]],
|
||||
|
||||
[1.23456789, [
|
||||
[0, "1.23456789"],
|
||||
[1, "1"],
|
||||
[2, "1.23"],
|
||||
[3, "1"],
|
||||
[4, "1.23"],
|
||||
[9, "123%"],
|
||||
[10, "123.46%"],
|
||||
[11, "1.23E+00"],
|
||||
[12, "1 1/4"],
|
||||
[13, "1 19/81"],
|
||||
[14, "1/1/00"],
|
||||
[15, "1-Jan-00"],
|
||||
[16, "1-Jan"],
|
||||
[17, "Jan-00"],
|
||||
[18, "5:37 AM"],
|
||||
[19, "5:37:47 AM"],
|
||||
[20, "5:37"],
|
||||
[21, "5:37:47"],
|
||||
[22, "1/1/00 5:37"],
|
||||
[37, "1 "],
|
||||
[38, "1 "],
|
||||
[39, "1.23"],
|
||||
[40, "1.23"],
|
||||
[45, "37:47"],
|
||||
[46, "29:37:47"],
|
||||
[47, "3746.7"],
|
||||
[48, "1.2E+0"],
|
||||
[49, "1.23456789"]
|
||||
]],
|
||||
|
||||
[0.123456789, [
|
||||
[0, "0.123456789"],
|
||||
[1, "0"],
|
||||
[2, "0.12"],
|
||||
[3, "0"],
|
||||
[4, "0.12"],
|
||||
[9, "12%"],
|
||||
[10, "12.35%"],
|
||||
[11, "1.23E-01"],
|
||||
[12, " 1/8"],
|
||||
[13, " 10/81"],
|
||||
[14, "1/0/00"],
|
||||
[15, "0-Jan-00"],
|
||||
[16, "0-Jan"],
|
||||
[17, "Jan-00"],
|
||||
[18, "2:57 AM"],
|
||||
[19, "2:57:47 AM"],
|
||||
[20, "2:57"],
|
||||
[21, "2:57:47"],
|
||||
[22, "1/0/00 2:57"],
|
||||
[37, "0 "],
|
||||
[38, "0 "],
|
||||
[39, "0.12"],
|
||||
[40, "0.12"],
|
||||
[45, "57:47"],
|
||||
[46, "2:57:47"],
|
||||
[47, "5746.7"],
|
||||
[48, "123.5E-3"],
|
||||
[49, "0.123456789"]
|
||||
]],
|
||||
|
||||
[0.0123456789, [
|
||||
[0, "0.012345679"],
|
||||
[1, "0"],
|
||||
[2, "0.01"],
|
||||
[3, "0"],
|
||||
[4, "0.01"],
|
||||
[9, "1%"],
|
||||
[10, "1.23%"],
|
||||
[11, "1.23E-02"],
|
||||
[12, "0 "],
|
||||
[13, " 1/81"],
|
||||
[14, "1/0/00"],
|
||||
[15, "0-Jan-00"],
|
||||
[16, "0-Jan"],
|
||||
[17, "Jan-00"],
|
||||
[18, "12:17 AM"],
|
||||
[19, "12:17:47 AM"],
|
||||
[20, "0:17"],
|
||||
[21, "0:17:47"],
|
||||
[22, "1/0/00 0:17"],
|
||||
[37, "0 "],
|
||||
[38, "0 "],
|
||||
[39, "0.01"],
|
||||
[40, "0.01"],
|
||||
[45, "17:47"],
|
||||
[46, "0:17:47"],
|
||||
[47, "1746.7"],
|
||||
[48, "12.3E-3"],
|
||||
[49, "0.012345679"]
|
||||
]],
|
||||
|
||||
[0.00123456789, [
|
||||
[0, "0.001234568"],
|
||||
[1, "0"],
|
||||
[2, "0.00"],
|
||||
[3, "0"],
|
||||
[4, "0.00"],
|
||||
[9, "0%"],
|
||||
[10, "0.12%"],
|
||||
[11, "1.23E-03"],
|
||||
[12, "0 "],
|
||||
[13, "0 "],
|
||||
[14, "1/0/00"],
|
||||
[15, "0-Jan-00"],
|
||||
[16, "0-Jan"],
|
||||
[17, "Jan-00"],
|
||||
[18, "12:01 AM"],
|
||||
[19, "12:01:47 AM"],
|
||||
[20, "0:01"],
|
||||
[21, "0:01:47"],
|
||||
[22, "1/0/00 0:01"],
|
||||
[37, "0 "],
|
||||
[38, "0 "],
|
||||
[39, "0.00"],
|
||||
[40, "0.00"],
|
||||
[45, "01:47"],
|
||||
[46, "0:01:47"],
|
||||
[47, "0146.7"],
|
||||
[48, "1.2E-3"],
|
||||
[49, "0.001234568"]
|
||||
]],
|
||||
|
||||
[0.000123456789, [
|
||||
[0, "0.000123457"],
|
||||
[1, "0"],
|
||||
[2, "0.00"],
|
||||
[3, "0"],
|
||||
[4, "0.00"],
|
||||
[9, "0%"],
|
||||
[10, "0.01%"],
|
||||
[11, "1.23E-04"],
|
||||
[12, "0 "],
|
||||
[13, "0 "],
|
||||
[14, "1/0/00"],
|
||||
[15, "0-Jan-00"],
|
||||
[16, "0-Jan"],
|
||||
[17, "Jan-00"],
|
||||
[18, "12:00 AM"],
|
||||
[19, "12:00:11 AM"],
|
||||
[20, "0:00"],
|
||||
[21, "0:00:11"],
|
||||
[22, "1/0/00 0:00"],
|
||||
[37, "0 "],
|
||||
[38, "0 "],
|
||||
[39, "0.00"],
|
||||
[40, "0.00"],
|
||||
[45, "00:11"],
|
||||
[46, "0:00:11"],
|
||||
[47, "0010.7"],
|
||||
[48, "123.5E-6"],
|
||||
[49, "0.000123457"]
|
||||
]],
|
||||
|
||||
[0.0000123456789, [
|
||||
[0, "1.23457E-05"],
|
||||
[1, "0"],
|
||||
[2, "0.00"],
|
||||
[3, "0"],
|
||||
[4, "0.00"],
|
||||
[9, "0%"],
|
||||
[10, "0.00%"],
|
||||
[11, "1.23E-05"],
|
||||
[12, "0 "],
|
||||
[13, "0 "],
|
||||
[14, "1/0/00"],
|
||||
[15, "0-Jan-00"],
|
||||
[16, "0-Jan"],
|
||||
[17, "Jan-00"],
|
||||
[18, "12:00 AM"],
|
||||
[19, "12:00:01 AM"],
|
||||
[20, "0:00"],
|
||||
[21, "0:00:01"],
|
||||
[22, "1/0/00 0:00"],
|
||||
[37, "0 "],
|
||||
[38, "0 "],
|
||||
[39, "0.00"],
|
||||
[40, "0.00"],
|
||||
[45, "00:01"],
|
||||
[46, "0:00:01"],
|
||||
[47, "0001.1"],
|
||||
[48, "12.3E-6"],
|
||||
[49, "1.23457E-05"]
|
||||
]],
|
||||
|
||||
[0.00000123456789, [
|
||||
[0, "1.23457E-06"],
|
||||
[1, "0"],
|
||||
[2, "0.00"],
|
||||
[3, "0"],
|
||||
[4, "0.00"],
|
||||
[9, "0%"],
|
||||
[10, "0.00%"],
|
||||
[11, "1.23E-06"],
|
||||
[12, "0 "],
|
||||
[13, "0 "],
|
||||
[14, "1/0/00"],
|
||||
[15, "0-Jan-00"],
|
||||
[16, "0-Jan"],
|
||||
[17, "Jan-00"],
|
||||
[18, "12:00 AM"],
|
||||
[19, "12:00:00 AM"],
|
||||
[20, "0:00"],
|
||||
[21, "0:00:00"],
|
||||
[22, "1/0/00 0:00"],
|
||||
[37, "0 "],
|
||||
[38, "0 "],
|
||||
[39, "0.00"],
|
||||
[40, "0.00"],
|
||||
[45, "00:00"],
|
||||
[46, "0:00:00"],
|
||||
[47, "0000.1"],
|
||||
[48, "1.2E-6"],
|
||||
[49, "1.23457E-06"]
|
||||
]],
|
||||
|
||||
[0.000000123456789, [
|
||||
[0, "1.23457E-07"],
|
||||
[1, "0"],
|
||||
[2, "0.00"],
|
||||
[3, "0"],
|
||||
[4, "0.00"],
|
||||
[9, "0%"],
|
||||
[10, "0.00%"],
|
||||
[11, "1.23E-07"],
|
||||
[12, "0 "],
|
||||
[13, "0 "],
|
||||
[14, "1/0/00"],
|
||||
[15, "0-Jan-00"],
|
||||
[16, "0-Jan"],
|
||||
[17, "Jan-00"],
|
||||
[18, "12:00 AM"],
|
||||
[19, "12:00:00 AM"],
|
||||
[20, "0:00"],
|
||||
[21, "0:00:00"],
|
||||
[22, "1/0/00 0:00"],
|
||||
[37, "0 "],
|
||||
[38, "0 "],
|
||||
[39, "0.00"],
|
||||
[40, "0.00"],
|
||||
[45, "00:00"],
|
||||
[46, "0:00:00"],
|
||||
[47, "0000.0"],
|
||||
[48, "123.5E-9"],
|
||||
[49, "1.23457E-07"]
|
||||
]],
|
||||
|
||||
[0.0000000123456789, [
|
||||
[0, "1.23457E-08"],
|
||||
[1, "0"],
|
||||
[2, "0.00"],
|
||||
[3, "0"],
|
||||
[4, "0.00"],
|
||||
[9, "0%"],
|
||||
[10, "0.00%"],
|
||||
[11, "1.23E-08"],
|
||||
[12, "0 "],
|
||||
[13, "0 "],
|
||||
[14, "1/0/00"],
|
||||
[15, "0-Jan-00"],
|
||||
[16, "0-Jan"],
|
||||
[17, "Jan-00"],
|
||||
[18, "12:00 AM"],
|
||||
[19, "12:00:00 AM"],
|
||||
[20, "0:00"],
|
||||
[21, "0:00:00"],
|
||||
[22, "1/0/00 0:00"],
|
||||
[37, "0 "],
|
||||
[38, "0 "],
|
||||
[39, "0.00"],
|
||||
[40, "0.00"],
|
||||
[45, "00:00"],
|
||||
[46, "0:00:00"],
|
||||
[47, "0000.0"],
|
||||
[48, "12.3E-9"],
|
||||
[49, "1.23457E-08"]
|
||||
]],
|
||||
|
||||
[0.00000000123456789, [
|
||||
[0, "1.23457E-09"],
|
||||
[1, "0"],
|
||||
[2, "0.00"],
|
||||
[3, "0"],
|
||||
[4, "0.00"],
|
||||
[9, "0%"],
|
||||
[10, "0.00%"],
|
||||
[11, "1.23E-09"],
|
||||
[12, "0 "],
|
||||
[13, "0 "],
|
||||
[14, "1/0/00"],
|
||||
[15, "0-Jan-00"],
|
||||
[16, "0-Jan"],
|
||||
[17, "Jan-00"],
|
||||
[18, "12:00 AM"],
|
||||
[19, "12:00:00 AM"],
|
||||
[20, "0:00"],
|
||||
[21, "0:00:00"],
|
||||
[22, "1/0/00 0:00"],
|
||||
[37, "0 "],
|
||||
[38, "0 "],
|
||||
[39, "0.00"],
|
||||
[40, "0.00"],
|
||||
[45, "00:00"],
|
||||
[46, "0:00:00"],
|
||||
[47, "0000.0"],
|
||||
[48, "1.2E-9"],
|
||||
[49, "1.23457E-09"]
|
||||
]],
|
||||
|
||||
[0.000000000123456789, [
|
||||
[0, "1.23457E-10"],
|
||||
[1, "0"],
|
||||
[2, "0.00"],
|
||||
[3, "0"],
|
||||
[4, "0.00"],
|
||||
[9, "0%"],
|
||||
[10, "0.00%"],
|
||||
[11, "1.23E-10"],
|
||||
[12, "0 "],
|
||||
[13, "0 "],
|
||||
[14, "1/0/00"],
|
||||
[15, "0-Jan-00"],
|
||||
[16, "0-Jan"],
|
||||
[17, "Jan-00"],
|
||||
[18, "12:00 AM"],
|
||||
[19, "12:00:00 AM"],
|
||||
[20, "0:00"],
|
||||
[21, "0:00:00"],
|
||||
[22, "1/0/00 0:00"],
|
||||
[37, "0 "],
|
||||
[38, "0 "],
|
||||
[39, "0.00"],
|
||||
[40, "0.00"],
|
||||
[45, "00:00"],
|
||||
[46, "0:00:00"],
|
||||
[47, "0000.0"],
|
||||
[48, "123.5E-12"],
|
||||
[49, "1.23457E-10"]
|
||||
]],
|
||||
|
||||
|
||||
|
||||
|
||||
[-12345.6789, [
|
||||
[0, "-12345.6789"],
|
||||
[1, "-12346"],
|
||||
[2, "-12345.68"],
|
||||
[3, "-12,346"],
|
||||
[4, "-12,345.68"],
|
||||
[9, "-1234568%"],
|
||||
[10, "-1234567.89%"],
|
||||
[11, "-1.23E+04"],
|
||||
[12, "-12345 2/3"],
|
||||
[13, "-12345 55/81"],
|
||||
[14, ""],
|
||||
[15, ""],
|
||||
[16, ""],
|
||||
[17, ""],
|
||||
[18, ""],
|
||||
[19, ""],
|
||||
[20, ""],
|
||||
[21, ""],
|
||||
[22, ""],
|
||||
[37, "(12,346)"],
|
||||
[38, "(12,346)"],
|
||||
[39, "(12,345.68)"],
|
||||
[40, "(12,345.68)"],
|
||||
[45, ""],
|
||||
[46, ""],
|
||||
[47, ""],
|
||||
[48, "-12.3E+3"],
|
||||
[49, "-12345.6789"]
|
||||
]],
|
||||
|
||||
[11.666666666666666, 0, "11.66666667"],
|
||||
[5.057996968497839, 0, "5.057996968"],
|
||||
[4.380353866983808, 0, "4.380353867"],
|
||||
[12.333333333333343, 0, "12.33333333"],
|
||||
[-0.000006211546860868111, 0, "-6.21155E-06"],
|
||||
[12345.67876, 47, "1724.9"],
|
||||
[0, 0, "0"]
|
||||
]
|
40
packages/ssf/test/implied.njs
Executable file
40
packages/ssf/test/implied.njs
Executable file
@ -0,0 +1,40 @@
|
||||
#!/usr/bin/env node
|
||||
var ssf = require("../");
|
||||
var val = 12345.6789;
|
||||
console.log(val);
|
||||
[
|
||||
"0", // 1
|
||||
"0.00", // 2
|
||||
"#,##0", // 3
|
||||
"#,##0.00", // 4
|
||||
"0%", // 9
|
||||
"0.00%", // 10
|
||||
"0.00E+00", // 11
|
||||
"# ?/?", // 12
|
||||
"# ??/??", // 13
|
||||
"m/d/yy", // 14
|
||||
"d-mmm-yy", // 15
|
||||
"d-mmm", // 16
|
||||
"mmm-yy", // 17
|
||||
"h:mm AM/PM", // 18
|
||||
"h:mm:ss AM/PM", // 19
|
||||
"h:mm", // 20
|
||||
"h:mm:ss", // 21
|
||||
"m/d/yy h:mm", // 22
|
||||
"#,##0 ;(#,##0)", // 37
|
||||
"#,##0 ;[Red](#,##0)", // 38
|
||||
"#,##0.00;(#,##0.00)", // 39
|
||||
"#,##0.00;[Red](#,##0.00)", // 40
|
||||
"mm:ss", // 45
|
||||
"[h]:mm:ss", // 46
|
||||
"mmss.0", // 47
|
||||
"##0.0E+0", // 48
|
||||
"@", // 49
|
||||
|
||||
"General" // 0
|
||||
].forEach(function(x) {
|
||||
try {
|
||||
console.log(x + "|" + ssf.format(x,val,{}));
|
||||
} catch (e) { }
|
||||
|
||||
});
|
447
packages/ssf/test/is_date.json
Normal file
447
packages/ssf/test/is_date.json
Normal file
@ -0,0 +1,447 @@
|
||||
[
|
||||
["General", false],
|
||||
["yyyy", true],
|
||||
["\" Excellent\"", false],
|
||||
["\" Fair\"", false],
|
||||
["\" Good\"", false],
|
||||
["\" Poor\"", false],
|
||||
["\" Very Good\"", false],
|
||||
["\"$\"#,##0", false],
|
||||
["\"$\"#,##0.00", false],
|
||||
["\"$\"#,##0.00_);[Red]\\(\"$\"#,##0.00\\)", false],
|
||||
["\"$\"#,##0.00_);\\(\"$\"#,##0.00\\)", false],
|
||||
["\"$\"#,##0;[Red]\\-\"$\"#,##0", false],
|
||||
["\"$\"#,##0_);[Red]\\(\"$\"#,##0\\)", false],
|
||||
["\"$\"#,##0_);\\(\"$\"#,##0\\)", false],
|
||||
["\"Haha!\"\\ @\\ \"Yeah!\"", false],
|
||||
["\"TRUE\";\"TRUE\";\"FALSE\"", false],
|
||||
["\"True\";\"True\";\"False\";@", false],
|
||||
["\"Years: \"0", false],
|
||||
["\"Yes\";\"Yes\";\"No\";@", false],
|
||||
["\"kl \"hh:mm:ss;@", true],
|
||||
["\"£\"#,##0.00", false],
|
||||
["\"£\"#,##0;[Red]\\-\"£\"#,##0", false],
|
||||
["\"€\"#,##0.00", false],
|
||||
["\"€\"\\ #,##0.00_-", false],
|
||||
["\"上午/下午 \"hh\"時\"mm\"分\"ss\"秒 \"", true],
|
||||
["\"¥\"#,##0.00;\"¥\"\\-#,##0.00", false],
|
||||
["#", false],
|
||||
["# ?/?", false],
|
||||
["# ??/??", false],
|
||||
["#\" \"?/?", false],
|
||||
["#\" \"??/??", false],
|
||||
["#\"abded\"\\ ??/??", false],
|
||||
["###0.00;-###0.00", false],
|
||||
["###0;-###0", false],
|
||||
["##0.0E+0", false],
|
||||
["#,##0", false],
|
||||
["#,##0 ;(#,##0)", false],
|
||||
["#,##0 ;[Red](#,##0)", false],
|
||||
["#,##0\"р.\";[Red]\\-#,##0\"р.\"", false],
|
||||
["#,##0.0", false],
|
||||
["#,##0.00", false],
|
||||
["#,##0.00 \"<22>\"", false],
|
||||
["#,##0.00 €;-#,##0.00 €", false],
|
||||
["#,##0.00\"р.\";[Red]\\-#,##0.00\"р.\"", false],
|
||||
["#,##0.000", false],
|
||||
["#,##0.0000", false],
|
||||
["#,##0.00000", false],
|
||||
["#,##0.000000", false],
|
||||
["#,##0.0000000", false],
|
||||
["#,##0.00000000", false],
|
||||
["#,##0.000000000", false],
|
||||
["#,##0.00000000;[Red]#,##0.00000000", false],
|
||||
["#,##0.0000_ ", false],
|
||||
["#,##0.000_ ", false],
|
||||
["#,##0.000_);\\(#,##0.000\\)", false],
|
||||
["#,##0.00;(#,##0.00)", false],
|
||||
["#,##0.00;(#,##0.00);0.00", false],
|
||||
["#,##0.00;[Red](#,##0.00)", false],
|
||||
["#,##0.00;[Red]\\(#,##0.00\\)", false],
|
||||
["#,##0.00;\\(#,##0.00\\)", false],
|
||||
["#,##0.00[$₹-449]_);\\(#,##0.00[$₹-449]\\)", false],
|
||||
["#,##0.00\\ \"р.\"", false],
|
||||
["#,##0.00\\ \"р.\";[Red]\\-#,##0.00\\ \"р.\"", false],
|
||||
["#,##0.00\\ [$€-407]", false],
|
||||
["#,##0.00\\ [$€-40C]", false],
|
||||
["#,##0.00_);\\(#,##0.00\\)", false],
|
||||
["#,##0.00_р_.;[Red]\\-#,##0.00_р_.", false],
|
||||
["#,##0.00_р_.;\\-#,##0.00_р_.", false],
|
||||
["#,##0.0;[Red]#,##0.0", false],
|
||||
["#,##0.0_ ;\\-#,##0.0\\ ", false],
|
||||
["#,##0.0_);[Red]\\(#,##0.0\\)", false],
|
||||
["#,##0.0_);\\(#,##0.0\\)", false],
|
||||
["#,##0;\\-#,##0;0", false],
|
||||
["#,##0\\ \"р.\";[Red]\\-#,##0\\ \"р.\"", false],
|
||||
["#,##0\\ \"р.\";\\-#,##0\\ \"р.\"", false],
|
||||
["#,##0\\ ;[Red]\\(#,##0\\)", false],
|
||||
["#,##0\\ ;\\(#,##0\\)", false],
|
||||
["#,##0_ ", false],
|
||||
["#,##0_ ;[Red]\\-#,##0\\ ", false],
|
||||
["#,##0_);[Red]\\(#,##0\\)", false],
|
||||
["#,##0_р_.;[Red]\\-#,##0_р_.", false],
|
||||
["#,##0_р_.;\\-#,##0_р_.", false],
|
||||
["#.0000,,", false],
|
||||
["#0", false],
|
||||
["#0.00", false],
|
||||
["#0.0000", false],
|
||||
["#\\ ?/10", false],
|
||||
["#\\ ?/2", false],
|
||||
["#\\ ?/4", false],
|
||||
["#\\ ?/8", false],
|
||||
["#\\ ?/?", false],
|
||||
["#\\ ??/100", false],
|
||||
["#\\ ??/100;[Red]\\(#\\ ??/16\\)", false],
|
||||
["#\\ ??/16", false],
|
||||
["#\\ ??/??", false],
|
||||
["#\\ ??/?????????", false],
|
||||
["#\\ ???/???", false],
|
||||
["**\\ #,###,#00,000.00,**", false],
|
||||
["0", false],
|
||||
["0\"abde\".0\"??\"000E+00", false],
|
||||
["0%", false],
|
||||
["0.0", false],
|
||||
["0.0%", false],
|
||||
["0.00", false],
|
||||
["0.00\"°\"", false],
|
||||
["0.00%", false],
|
||||
["0.000", false],
|
||||
["0.000%", false],
|
||||
["0.0000", false],
|
||||
["0.000000", false],
|
||||
["0.00000000", false],
|
||||
["0.000000000", false],
|
||||
["0.000000000%", false],
|
||||
["0.00000000000", false],
|
||||
["0.000000000000000", false],
|
||||
["0.00000000E+00", false],
|
||||
["0.0000E+00", false],
|
||||
["0.00;[Red]0.00", false],
|
||||
["0.00E+00", false],
|
||||
["0.00_);[Red]\\(0.00\\)", false],
|
||||
["0.00_);\\(0.00\\)", false],
|
||||
["0.0_ ", false],
|
||||
["00.00.00.000", false],
|
||||
["00.000%", false],
|
||||
["0000", false],
|
||||
["00000", false],
|
||||
["00000000", false],
|
||||
["000000000", false],
|
||||
["00000\\-0000", false],
|
||||
["00000\\-00000", false],
|
||||
["000\\-00\\-0000", false],
|
||||
["0;[Red]0", false],
|
||||
["0\\-00000\\-00000\\-0", false],
|
||||
["0_);[Red]\\(0\\)", false],
|
||||
["0_);\\(0\\)", false],
|
||||
["@", false],
|
||||
["A/P", true],
|
||||
["AM/PM", true],
|
||||
["AM/PMh\"時\"mm\"分\"ss\"秒\";@", true],
|
||||
["D", true],
|
||||
["DD", true],
|
||||
["DD/MM/YY;@", true],
|
||||
["DD/MM/YYYY", true],
|
||||
["DD/MM/YYYY;@", true],
|
||||
["DDD", true],
|
||||
["DDDD", true],
|
||||
["DDDD\", \"MMMM\\ DD\", \"YYYY", true],
|
||||
["GENERAL", false],
|
||||
["General", false],
|
||||
["H", true],
|
||||
["H:MM:SS\\ AM/PM", true],
|
||||
["HH:MM", true],
|
||||
["HH:MM:SS\\ AM/PM", true],
|
||||
["HHM", true],
|
||||
["HHMM", true],
|
||||
["HH[MM]", true],
|
||||
["HH[M]", true],
|
||||
["M/D/YYYY", true],
|
||||
["M/D/YYYY\\ H:MM", true],
|
||||
["MM/DD/YY", true],
|
||||
["S", true],
|
||||
["SS", true],
|
||||
["YY", true],
|
||||
["YYM", true],
|
||||
["YYMM", true],
|
||||
["YYMMM", true],
|
||||
["YYMMMM", true],
|
||||
["YYMMMMM", true],
|
||||
["YYYY", true],
|
||||
["YYYY-MM-DD HH:MM:SS", true],
|
||||
["YYYY\\-MM\\-DD", true],
|
||||
["[$$-409]#,##0", false],
|
||||
["[$$-409]#,##0.00", false],
|
||||
["[$$-409]#,##0.00_);[Red]\\([$$-409]#,##0.00\\)", false],
|
||||
["[$$-C09]#,##0.00", false],
|
||||
["[$-100042A]h:mm:ss\\ AM/PM;@", true],
|
||||
["[$-1010409]0.000%", false],
|
||||
["[$-1010409]General", false],
|
||||
["[$-1010409]d/m/yyyy\\ h:mm\\ AM/PM;@", true],
|
||||
["[$-1010409]dddd, mmmm dd, yyyy", true],
|
||||
["[$-1010409]m/d/yyyy", true],
|
||||
["[$-1409]h:mm:ss\\ AM/PM;@", true],
|
||||
["[$-2000000]h:mm:ss;@", true],
|
||||
["[$-2010401]d/mm/yyyy\\ h:mm\\ AM/PM;@", true],
|
||||
["[$-4000439]h:mm:ss\\ AM/PM;@", true],
|
||||
["[$-4010439]d/m/yyyy\\ h:mm\\ AM/PM;@", true],
|
||||
["[$-409]AM/PM\\ hh:mm:ss;@", true],
|
||||
["[$-409]d/m/yyyy\\ hh:mm;@", true],
|
||||
["[$-409]d\\-mmm;@", true],
|
||||
["[$-409]d\\-mmm\\-yy;@", true],
|
||||
["[$-409]d\\-mmm\\-yyyy;@", true],
|
||||
["[$-409]dd/mm/yyyy\\ hh:mm;@", true],
|
||||
["[$-409]dd\\-mmm\\-yy;@", true],
|
||||
["[$-409]h:mm:ss\\ AM/PM;@", true],
|
||||
["[$-409]h:mm\\ AM/PM;@", true],
|
||||
["[$-409]m/d/yy\\ h:mm\\ AM/PM;@", true],
|
||||
["[$-409]mmm\\-yy;@", true],
|
||||
["[$-409]mmmm\\ d\\,\\ yyyy;@", true],
|
||||
["[$-409]mmmm\\-yy;@", true],
|
||||
["[$-409]mmmmm;@", true],
|
||||
["[$-409]mmmmm\\-yy;@", true],
|
||||
["[$-40E]h\\ \"óra\"\\ m\\ \"perckor\"\\ AM/PM;@", true],
|
||||
["[$-412]AM/PM\\ h\"시\"\\ mm\"분\"\\ ss\"초\";@", true],
|
||||
["[$-41C]h:mm:ss\\.AM/PM;@", true],
|
||||
["[$-449]hh:mm:ss\\ AM/PM;@", true],
|
||||
["[$-44E]hh:mm:ss\\ AM/PM;@", true],
|
||||
["[$-44F]hh:mm:ss\\ AM/PM;@", true],
|
||||
["[$-D000409]h:mm\\ AM/PM;@", true],
|
||||
["[$-D010000]d/mm/yyyy\\ h:mm\\ \"น.\";@", true],
|
||||
["[$-F400]h:mm:ss\\ AM/PM", true],
|
||||
["[$-F800]dddd\\,\\ mmmm\\ dd\\,\\ yyyy", true],
|
||||
["[$AUD]\\ #,##0.00", false],
|
||||
["[$RD$-1C0A]#,##0.00;[Red]\\-[$RD$-1C0A]#,##0.00", false],
|
||||
["[$SFr.-810]\\ #,##0.00_);[Red]\\([$SFr.-810]\\ #,##0.00\\)", false],
|
||||
["[$£-809]#,##0.00;[Red][$£-809]#,##0.00", false],
|
||||
["[$¥-411]#,##0.00", false],
|
||||
["[$¥-804]#,##0.00", false],
|
||||
["[<0]\"\";0%", false],
|
||||
["[<=9999999]###\\-####;\\(###\\)\\ ###\\-####", false],
|
||||
["[=0]?;#,##0.00", false],
|
||||
["[=0]?;0%", false],
|
||||
["[=0]?;[<4.16666666666667][hh]:mm:ss;[hh]:mm", true],
|
||||
["[>999999]#,,\"M\";[>999]#,\"K\";#", false],
|
||||
["[>999999]#.000,,\"M\";[>999]#.000,\"K\";#.000", false],
|
||||
["[>=100000]0.000\\ \\\";[Red]0.000\\ \\<\\ \\>\\ \\\"\\ \\&\\ \\'\\ ", false],
|
||||
["[>=100000]0.000\\ \\<;[Red]0.000\\ \\>", false],
|
||||
["[BLACK]@", false],
|
||||
["[BLUE]GENERAL", false],
|
||||
["[Black]@", false],
|
||||
["[Blue]General", false],
|
||||
["[CYAN]@", false],
|
||||
["[Cyan]@", false],
|
||||
["[DBNum1][$-804]AM/PMh\"时\"mm\"分\";@", true],
|
||||
["[DBNum1][$-804]General", false],
|
||||
["[DBNum1][$-804]h\"时\"mm\"分\";@", true],
|
||||
["[ENG][$-1004]dddd\\,\\ d\\ mmmm\\,\\ yyyy;@", true],
|
||||
["[ENG][$-101040D]d\\ mmmm\\ yyyy;@", true],
|
||||
["[ENG][$-101042A]d\\ mmmm\\ yyyy;@", true],
|
||||
["[ENG][$-140C]dddd\\ \"YeahWoo!\"\\ ddd\\ mmmm\\ yyyy;@", true],
|
||||
["[ENG][$-2C0A]dddd\\ d\" de \"mmmm\" de \"yyyy;@", true],
|
||||
["[ENG][$-402]dd\\ mmmm\\ yyyy\\ \"г.\";@", true],
|
||||
["[ENG][$-403]dddd\\,\\ d\" / \"mmmm\" / \"yyyy;@", true],
|
||||
["[ENG][$-405]d\\.\\ mmmm\\ yyyy;@", true],
|
||||
["[ENG][$-408]d\\ mmmm\\ yyyy;@", true],
|
||||
["[ENG][$-409]d\\-mmm;@", true],
|
||||
["[ENG][$-409]d\\-mmm\\-yy;@", true],
|
||||
["[ENG][$-409]d\\-mmm\\-yyyy;@", true],
|
||||
["[ENG][$-409]dd\\-mmm\\-yy;@", true],
|
||||
["[ENG][$-409]mmm\\-yy;@", true],
|
||||
["[ENG][$-409]mmmm\\ d\\,\\ yyyy;@", true],
|
||||
["[ENG][$-409]mmmm\\-yy;@", true],
|
||||
["[ENG][$-40B]d\\.\\ mmmm\\t\\a\\ yyyy;@", true],
|
||||
["[ENG][$-40C]d/mmm/yyyy;@", true],
|
||||
["[ENG][$-40E]yyyy/\\ mmmm\\ d\\.;@", true],
|
||||
["[ENG][$-40F]dd\\.\\ mmmm\\ yyyy;@", true],
|
||||
["[ENG][$-410]d\\ mmmm\\ yyyy;@", true],
|
||||
["[ENG][$-415]d\\ mmmm\\ yyyy;@", true],
|
||||
["[ENG][$-416]d\\ \\ mmmm\\,\\ yyyy;@", true],
|
||||
["[ENG][$-418]d\\ mmmm\\ yyyy;@", true],
|
||||
["[ENG][$-41A]d\\.\\ mmmm\\ yyyy\\.;@", true],
|
||||
["[ENG][$-41B]d\\.\\ mmmm\\ yyyy;@", true],
|
||||
["[ENG][$-41D]\"den \"\\ d\\ mmmm\\ yyyy;@", true],
|
||||
["[ENG][$-420]dddd\\,\\ dd\\ mmmm\\,\\ yyyy;@", true],
|
||||
["[ENG][$-421]dd\\ mmmm\\ yyyy;@", true],
|
||||
["[ENG][$-424]dddd\\,\\ d\\.\\ mmmm\\ yyyy;@", true],
|
||||
["[ENG][$-425]dddd\\,\\ d\\.\\ mmmm\\ yyyy;@", true],
|
||||
["[ENG][$-426]dddd\\,\\ yyyy\". gada \"d\\.\\ mmmm;@", true],
|
||||
["[ENG][$-427]yyyy\\ \"m.\"\\ mmmm\\ d\\ \"d.\";@", true],
|
||||
["[ENG][$-42B]dddd\\,\\ d\\ mmmm\\ yyyy;@", true],
|
||||
["[ENG][$-42C]d\\ mmmm\\ yyyy;@", true],
|
||||
["[ENG][$-42D]yyyy\"(e)ko\"\\ mmmm\"ren\"\\ d\"a\";@", true],
|
||||
["[ENG][$-42F]dddd\\,\\ dd\\ mmmm\\ yyyy;@", true],
|
||||
["[ENG][$-437]yyyy\\ \\წ\\ლ\\ი\\ს\\ dd\\ mm\\,\\ dddd;@", true],
|
||||
["[ENG][$-438]d\\.\\ mmmm\\ yyyy;@", true],
|
||||
["[ENG][$-43F]d\\ mmmm\\ yyyy\\ \"ж.\";@", true],
|
||||
["[ENG][$-444]d\\ mmmm\\ yyyy;@", true],
|
||||
["[ENG][$-449]dd\\ mmmm\\ yyyy;@", true],
|
||||
["[ENG][$-44E]d\\ mmmm\\ yyyy;@", true],
|
||||
["[ENG][$-44F]dd\\ mmmm\\ yyyy\\ dddd;@", true],
|
||||
["[ENG][$-457]dd\\ mmmm\\ yyyy;@", true],
|
||||
["[ENG][$-813]dddd\\ d\\ mmmm\\ yyyy;@", true],
|
||||
["[ENG][$-81A]dddd\\,\\ d\\.\\ mmmm\\ yyyy;@", true],
|
||||
["[ENG][$-82C]d\\ mmmm\\ yyyy;@", true],
|
||||
["[ENG][$-843]yyyy\\ \"й\"\"и\"\"л\"\\ d/mmmm;@", true],
|
||||
["[ENG][$-C07]dddd\\,\\ dd\\.\\ mmmm\\ yyyy;@", true],
|
||||
["[ENG][$-FC19]yyyy\\,\\ dd\\ mmmm;@", true],
|
||||
["[ENG][$-FC22]d\\ mmmm\\ yyyy\" р.\";@", true],
|
||||
["[ENG][$-FC23]d\\ mmmm\\ yyyy;@", true],
|
||||
["[GREEN]#,###", false],
|
||||
["[Green]#,###", false],
|
||||
["[HH]", true],
|
||||
["[HIJ][$-2060401]d/mm/yyyy\\ h:mm\\ AM/PM;@", true],
|
||||
["[HIJ][$-2060401]d\\ mmmm\\ yyyy;@", true],
|
||||
["[H]", true],
|
||||
["[JPN][$-411]gggyy\"年\"m\"月\"d\"日\"\\ dddd;@", true],
|
||||
["[MAGENTA]0.00", false],
|
||||
["[Magenta]0.00", false],
|
||||
["[RED]#.##", false],
|
||||
["[Red]#.##", false],
|
||||
["[Red][<-25]General;[Blue][>25]General;[Green]General;[Yellow]General\\ ", false],
|
||||
["[Red][<=-25]General;[Blue][>=25]General;[Green]General;[Yellow]General", false],
|
||||
["[Red][<>50]General;[Blue]000", false],
|
||||
["[Red][=50]General;[Blue]000", false],
|
||||
["[SS]", true],
|
||||
["[S]", true],
|
||||
["[TWN][DBNum1][$-404]y\"年\"m\"月\"d\"日\";@", true],
|
||||
["[WHITE]0.0", false],
|
||||
["[White]0.0", false],
|
||||
["[YELLOW]@", false],
|
||||
["[Yellow]@", false],
|
||||
["[h]", true],
|
||||
["[h]:mm:ss", true],
|
||||
["[h]:mm:ss;@", true],
|
||||
["[h]\\.mm\" Uhr \";@", true],
|
||||
["[hh]", true],
|
||||
["[s]", true],
|
||||
["[ss]", true],
|
||||
["\\#\\r\\e\\c", false],
|
||||
["\\$#,##0_);[Red]\\\"($\\\"#,##0\\)", false],
|
||||
["\\$0.00", false],
|
||||
["\\C\\O\\B\\ \\o\\n\\ @", false],
|
||||
["\\C\\R\\O\\N\\T\\A\\B\\ \\o\\n\\ @", false],
|
||||
["\\R\\e\\s\\u\\l\\t\\ \\o\\n\\ @", false],
|
||||
["\\S\\Q\\L\\ \\:\\ @", false],
|
||||
["\\S\\Q\\L\\ \\R\\e\\q\\u\\e\\s\\t\\ \\f\\o\\r\\ @", false],
|
||||
["\\c\\c\\c?????0\"aaaa\"0\"bbbb\"000000.00%", false],
|
||||
["\\u\\n\\t\\i\\l\\ h:mm;@", true],
|
||||
["_ * #,##0.00_)[$﷼-429]_ ;_ * \\(#,##0.00\\)[$﷼-429]_ ;_ * \"-\"??_)[$﷼-429]_ ;_ @_ ", false],
|
||||
["_ * #,##0_ ;_ * \\-#,##0_ ;[Red]_ * \"-\"_ ;_ @_ ", false],
|
||||
["_(\"$\"* #,##0.00_);_(\"$\"* \\(#,##0.00\\);_(\"$\"* \"-\"??_);_(@_)", false],
|
||||
["_(\"$\"* #,##0_);_(\"$\"* \\(#,##0\\);_(\"$\"* \"-\"??_);_(@_)", false],
|
||||
["_(\"$\"* #,##0_);_(\"$\"* \\(#,##0\\);_(\"$\"* \"-\"_);_(@_)", false],
|
||||
["_(* #,##0.0000_);_(* \\(#,##0.0000\\);_(* \"-\"??_);_(@_)", false],
|
||||
["_(* #,##0.000_);_(* \\(#,##0.000\\);_(* \"-\"??_);_(@_)", false],
|
||||
["_(* #,##0.00_);_(* \\(#,##0.00\\);_(* \"-\"??_);_(@_)", false],
|
||||
["_(* #,##0.0_);_(* \\(#,##0.0\\);_(* \"-\"??_);_(@_)", false],
|
||||
["_(* #,##0_);_(* \\(#,##0\\);_(* \"-\"??_);_(@_)", false],
|
||||
["_(* #,##0_);_(* \\(#,##0\\);_(* \"-\"_);_(@_)", false],
|
||||
["_([$ANG]\\ * #,##0.0_);_([$ANG]\\ * \\(#,##0.0\\);_([$ANG]\\ * \"-\"?_);_(@_)", false],
|
||||
["_-\"€\"\\ * #,##0.00_-;_-\"€\"\\ * #,##0.00\\-;_-\"€\"\\ * \"-\"??_-;_-@_-", false],
|
||||
["_-* #,##0.00\" TL\"_-;\\-* #,##0.00\" TL\"_-;_-* \\-??\" TL\"_-;_-@_-", false],
|
||||
["_-* #,##0.00\" €\"_-;\\-* #,##0.00\" €\"_-;_-* \\-??\" €\"_-;_-@_-", false],
|
||||
["_-* #,##0.00\\ \"р.\"_-;\\-* #,##0.00\\ \"р.\"_-;_-* \"-\"??\\ \"р.\"_-;_-@_-", false],
|
||||
["_-* #,##0.00\\ \"€\"_-;\\-* #,##0.00\\ \"€\"_-;_-* \"-\"??\\ \"€\"_-;_-@_-", false],
|
||||
["_-* #,##0.00\\ [$€-407]_-;\\-* #,##0.00\\ [$€-407]_-;_-* \\-??\\ [$€-407]_-;_-@_-", false],
|
||||
["_-* #,##0.0\\ _F_-;\\-* #,##0.0\\ _F_-;_-* \"-\"??\\ _F_-;_-@_-", false],
|
||||
["_-* #,##0\\ \"€\"_-;\\-* #,##0\\ \"€\"_-;_-* \"-\"\\ \"€\"_-;_-@_-", false],
|
||||
["_-* #,##0_-;\\-* #,##0_-;_-* \"-\"??_-;_-@_-", false],
|
||||
["_-\\$* #,##0.0_ ;_-\\$* \\-#,##0.0\\ ;_-\\$* \"-\"?_ ;_-@_ ", false],
|
||||
["d", true],
|
||||
["d-mmm", true],
|
||||
["d-mmm-yy", true],
|
||||
["d/m", true],
|
||||
["d/m/yy;@", true],
|
||||
["d/m/yyyy;@", true],
|
||||
["d/mm/yy;@", true],
|
||||
["d/mm/yyyy;@", true],
|
||||
["d\\-mmm", true],
|
||||
["d\\-mmm\\-yyyy", true],
|
||||
["dd", true],
|
||||
["dd\"-\"mmm\"-\"yyyy", true],
|
||||
["dd/m/yyyy", true],
|
||||
["dd/mm/yy", true],
|
||||
["dd/mm/yy;@", true],
|
||||
["dd/mm/yy\\ hh:mm", true],
|
||||
["dd/mm/yyyy", true],
|
||||
["dd/mm/yyyy\\ hh:mm:ss", true],
|
||||
["dd/mmm", true],
|
||||
["dd\\-mm\\-yy", true],
|
||||
["dd\\-mmm\\-yy", true],
|
||||
["dd\\-mmm\\-yyyy\\ hh:mm:ss.000", true],
|
||||
["dd\/mm\/yy", true],
|
||||
["dd\/mm\/yyyy", true],
|
||||
["ddd", true],
|
||||
["dddd", true],
|
||||
["dddd, mmmm dd, yyyy", true],
|
||||
["h", true],
|
||||
["h\"时\"mm\"分\"ss\"秒\";@", true],
|
||||
["h\"時\"mm\"分\"ss\"秒\";@", true],
|
||||
["h:mm", true],
|
||||
["h:mm AM/PM", true],
|
||||
["h:mm:ss", true],
|
||||
["h:mm:ss AM/PM", true],
|
||||
["h:mm:ss;@", true],
|
||||
["h:mm;@", true],
|
||||
["h\\.mm\" Uhr \";@", true],
|
||||
["h\\.mm\" h\";@", true],
|
||||
["h\\.mm\" u.\";@", true],
|
||||
["hh\":\"mm AM/PM", true],
|
||||
["hh:mm:ss", true],
|
||||
["hh:mm:ss\\ AM/PM", true],
|
||||
["hh\\.mm\" h\";@", true],
|
||||
["hhm", true],
|
||||
["hhmm", true],
|
||||
["m\"月\"d\"日\"", true],
|
||||
["m/d/yy", true],
|
||||
["m/d/yy h:mm", true],
|
||||
["m/d/yy;@", true],
|
||||
["m/d/yy\\ h:mm", true],
|
||||
["m/d/yy\\ h:mm;@", true],
|
||||
["m/d/yyyy", true],
|
||||
["m/d/yyyy;@", true],
|
||||
["m/d/yyyy\\ h:mm:ss;@", true],
|
||||
["m/d;@", true],
|
||||
["m\/d\/yyyy", true],
|
||||
["mm/dd", true],
|
||||
["mm/dd/yy", true],
|
||||
["mm/dd/yy;@", true],
|
||||
["mm/dd/yyyy", true],
|
||||
["mm:ss", true],
|
||||
["mm:ss.0;@", true],
|
||||
["mmm d, yyyy", true],
|
||||
["mmm\" \"d\", \"yyyy", true],
|
||||
["mmm-yy", true],
|
||||
["mmm-yy;@", true],
|
||||
["mmm/yy", true],
|
||||
["mmm\\-yy", true],
|
||||
["mmm\\-yy;@", true],
|
||||
["mmm\\-yyyy", true],
|
||||
["mmmm\\ d\\,\\ yyyy", true],
|
||||
["mmmm\\ yyyy", true],
|
||||
["mmss.0", true],
|
||||
["s", true],
|
||||
["ss", true],
|
||||
["yy", true],
|
||||
["yy/mm/dd", true],
|
||||
["yy\\.mm\\.dd", true],
|
||||
["yym", true],
|
||||
["yymm", true],
|
||||
["yymmm", true],
|
||||
["yymmmm", true],
|
||||
["yymmmmm", true],
|
||||
["yyyy", true],
|
||||
["yyyy\"년\"\\ m\"월\"\\ d\"일\";@", true],
|
||||
["yyyy-m-d h:mm AM/PM", true],
|
||||
["yyyy-mm-dd", true],
|
||||
["yyyy/mm/dd", true],
|
||||
["yyyy\\-m\\-d\\ hh:mm:ss", true],
|
||||
["yyyy\\-mm\\-dd", true],
|
||||
["yyyy\\-mm\\-dd;@", true],
|
||||
["yyyy\\-mm\\-dd\\ h:mm", true],
|
||||
["yyyy\\-mm\\-dd\\Thh:mm", true],
|
||||
["yyyy\\-mm\\-dd\\Thhmmss.000", true],
|
||||
["###,##0", false],
|
||||
["#,###.00", false]
|
||||
]
|
57
packages/ssf/test/negative.js
Normal file
57
packages/ssf/test/negative.js
Normal file
@ -0,0 +1,57 @@
|
||||
/* vim: set ts=2: */
|
||||
/*jshint loopfunc:true, mocha:true, node:true */
|
||||
/*eslint-env mocha, node */
|
||||
var SSF = require('../');
|
||||
var assert = require('assert');
|
||||
|
||||
/* {format, data:[[value, result]]} */
|
||||
var data = [
|
||||
{
|
||||
format: '"$"#,##0_);\\("$"#,##0\\);"-"',
|
||||
data: [
|
||||
[10000, "$10,000 "],
|
||||
[9000.98, "$9,001 "],
|
||||
[100, "$100 "],
|
||||
[50.02, "$50 "],
|
||||
[1, "$1 "],
|
||||
[0.1, "$0 "],
|
||||
[0.01, "$0 "],
|
||||
[0, "-"],
|
||||
[-10000, "($10,000)"],
|
||||
[-9000.98, "($9,001)"],
|
||||
[-100, "($100)"],
|
||||
[-50.02, "($50)"],
|
||||
[-1, "($1)"],
|
||||
[-0.1, "($0)"],
|
||||
[-0.01, "($0)"]
|
||||
]
|
||||
},
|
||||
{
|
||||
format: '(#,##0.00)',
|
||||
data: [
|
||||
[-12345.6789, "-(12,345.68)"]
|
||||
]
|
||||
},
|
||||
{
|
||||
format: '#,##0.00;\\(#,##0.00\\)',
|
||||
data: [
|
||||
[-12345.6789, "(12,345.68)"]
|
||||
]
|
||||
},
|
||||
{
|
||||
format: '[<=9999999]###\\-####;(###) ###\\-####',
|
||||
data: [
|
||||
[2813308004, '(281) 330-8004']
|
||||
]
|
||||
}
|
||||
];
|
||||
|
||||
describe("negatives", function() {
|
||||
data.forEach(function(row) {
|
||||
it(row.format, function() {
|
||||
row.data.forEach(function(r) {
|
||||
assert.equal(SSF.format(row.format, r[0]), r[1]);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
22
packages/ssf/test/oddities.js
Normal file
22
packages/ssf/test/oddities.js
Normal file
@ -0,0 +1,22 @@
|
||||
/* vim: set ts=2: */
|
||||
/*jshint loopfunc:true, mocha:true, node:true */
|
||||
var SSF = require('../');
|
||||
var fs = require('fs'), assert = require('assert');
|
||||
var data = JSON.parse(fs.readFileSync('./test/oddities.json','utf8'));
|
||||
describe('oddities', function() {
|
||||
data.forEach(function(d) {
|
||||
it(String(d[0]), function(){
|
||||
for(var j=1;j<d.length;++j) {
|
||||
if(d[j].length == 2) {
|
||||
var expected = d[j][1], actual = SSF.format(d[0], d[j][0], {});
|
||||
assert.equal(actual, expected);
|
||||
} else if(d[j][2] !== "#") assert.throws(function() { SSF.format(d[0], d[j][0]); });
|
||||
}
|
||||
});
|
||||
});
|
||||
it('should fail for bad formats', function() {
|
||||
var bad = ['##,##'];
|
||||
var chk = function(fmt){ return function(){ SSF.format(fmt,0); }; };
|
||||
bad.forEach(function(fmt){assert.throws(chk(fmt));});
|
||||
});
|
||||
});
|
180
packages/ssf/test/oddities.json
Normal file
180
packages/ssf/test/oddities.json
Normal file
@ -0,0 +1,180 @@
|
||||
[
|
||||
["\"foo\";\"bar\";\"baz\";\"qux\"",
|
||||
[1, "foo"], [-1, "bar"], [0, "baz"], ["sheetjs", "qux"]
|
||||
],
|
||||
["\"foo\";\"bar\";\"baz\"",
|
||||
[1, "foo"], [-1, "bar"], [0, "baz"], ["sheetjs", "sheetjs"]
|
||||
],
|
||||
["\"foo\";\"bar\";@",
|
||||
[1, "foo"], [-1, "bar"], [0, "foo"], ["sheetjs", "sheetjs"]
|
||||
],
|
||||
["\"foo\";\"bar\"",
|
||||
[1, "foo"], [-1, "bar"], [0, "foo"], ["sheetjs", "sheetjs"]
|
||||
],
|
||||
["@@", [1, "1"], [-1, "-1"], [0, "0"], ["sheetjs", "sheetjssheetjs"]],
|
||||
["[Blue]General", [1, "1"], [-1, "-1"], [0, "0"], ["sheetjs", "sheetjs"]],
|
||||
["[Blue]G3neral", [1], [-1], [0], ["TODO","TODO"]],
|
||||
["A\"TODO\"", [1, "ATODO"], [-1, "ATODO"], [0, "ATODO"], ["TODO","TODO"]],
|
||||
["r", [1,"r"], [-1,"-r","#"], [0,"r"], ["sheetjs","sheetjs"]],
|
||||
["((;@", [1,"(("], [0,"(("], ["foo","foo"]],
|
||||
["\\r", [1, "r"], [-1, "r"], [0, "r"], ["TODO","TODO"]],
|
||||
["_($* #,##0_);_($* (#,##0);_($* \"-\"_);_(@_)", [1, " $1 "], [-1, " $(1)"], [0," $- "], ["TODO", " TODO "], ["",""]],
|
||||
["#0.#", [0,"0."], [1,"1."], [12,"12."], [12.34, "12.3"], [-1.23, "-1.2"]],
|
||||
["#,##0.0", [1,"1.0"], [-1,"-1.0"], [0,"0.0"], ["TODO","TODO"]],
|
||||
["#,##0.00", [1,"1.00"], [-1,"-1.00"], [0,"0.00"], ["TODO","TODO"]],
|
||||
["#,##0.000", [1,"1.000"], [-1,"-1.000"], [0,"0.000"], ["TODO","TODO"]],
|
||||
["#,##0.0000", [1,"1.0000"], [-1,"-1.0000"], [0,"0.0000"], ["TODO","TODO"]],
|
||||
["#,##0.00000", [1000000, "1,000,000.00000"]],
|
||||
["#,##0.000000", [1000000, "1,000,000.000000"]],
|
||||
["#,##0.0000000", [1000000, "1,000,000.0000000"]],
|
||||
["#,##0.00000000", [1000000, "1,000,000.00000000"]],
|
||||
["#,##0.000000000", [1000000, "1,000,000.000000000"]],
|
||||
["#,###", [1, "1"], [-1, "-1"], [0,""], [12345.6789, "12,346"], ["TODO", "TODO"]],
|
||||
["#.##", [1, "1."], [-1, "-1."], [0,"."], ["sheetjs", "sheetjs"]],
|
||||
["0;0", [1.1, "1"], [-1.1, "1"], [0,"0"], ["sheetjs", "sheetjs"]],
|
||||
["0.0", [1, "1.0"], [-1, "-1.0"], [0,"0.0"], ["sheetjs", "sheetjs"]],
|
||||
["0.00", [1.0001, "1.00"], [-1, "-1.00"], [0,"0.00"], ["sheetjs", "sheetjs"]],
|
||||
["0.000", [1, "1.000"], [-1, "-1.000"], [0,"0.000"], ["sheetjs", "sheetjs"]],
|
||||
["0.0000", [1, "1.0000"], [-1, "-1.0000"], [0,"0.0000"], ["sheetjs", "sheetjs"]],
|
||||
["hh:mm AM/PM", [0.7, "04:48 PM"]],
|
||||
["hhh:mm AM/PM", [0.7]],
|
||||
["hhh:mmm:sss", [0.7]],
|
||||
["hh:mmm:sss", [0.7]],
|
||||
["hh:mm:sss", [0.7]],
|
||||
["hh:mm:ss.000", [0.7,"16:48:00.000"], [0.70707,"16:58:10.848"]],
|
||||
["hh.000", [0.70707, "16.848"]],
|
||||
["hh .00", [0.70707, "16 .85"]],
|
||||
["hh .0", [0.70707, "16 .8"]],
|
||||
["hh .00 .000", [0.70707, "16 .84 .848"]],
|
||||
["[hhh]", [0.7]],
|
||||
["[", [0.7]],
|
||||
["A/P", [0.7, "P"]],
|
||||
["e", [0.7, "1900"]],
|
||||
["123", [0.7, "123"], [0, "123"], ["sheetjs", "sheetjs"]],
|
||||
["0.##", [1,"1."], [-1,"-1."], [0, "0."], [1.1, "1.1"], [-1.2, "-1.2"], [1000000000000.01, "1000000000000.01"], [-1000.01, "-1000.01"], [0.1, "0.1"], [1.007, "1.01"], [-1.008, "-1.01"]],
|
||||
["** #,###,#00,000.00,**",
|
||||
[1.2345, " 00,000.00"],
|
||||
[12.345, " 00,000.01"],
|
||||
[123.45, " 00,000.12"],
|
||||
[1234.56, " 00,001.23"],
|
||||
[12345.67, " 00,012.35"],
|
||||
[123456.78, " 00,123.46"],
|
||||
[1234567.89, " 01,234.57"],
|
||||
[12345681.9, " 12,345.68"],
|
||||
[123456822, " 123,456.82"],
|
||||
[1234568223, " 1,234,568.22"],
|
||||
[12345682233, " 12,345,682.23"],
|
||||
[123456822333, " 123,456,822.33"],
|
||||
[1234568223333, " 1,234,568,223.33"],
|
||||
[12345682233333, " 12,345,682,233.33"],
|
||||
[123456822333333, " 123,456,822,333.33"],
|
||||
[1234568223333330, " 1,234,568,223,333.33"],
|
||||
[12345682233333300, " 12,345,682,233,333.30"],
|
||||
[123456822333333000, " 123,456,822,333,333.00", "#"],
|
||||
[1234568223333330000, " 1,234,568,223,333,330.00"],
|
||||
[12345682233333300000, " 12,345,682,233,333,300.00"],
|
||||
[123456822333333000000, " 123,456,822,333,333,000.00"],
|
||||
[1234568223333330000000, " 1,234,568,223,333,330,000.00"]
|
||||
],
|
||||
["00,000.00,", [12345, "00,012.35"] ],
|
||||
["00,000.00", [12345, "12,345.00"] ],
|
||||
["000#0#0#0##00##00##0#########", [12345, "0000000000012345"] ],
|
||||
["##0.0E+0",
|
||||
[1, "1.0E+0"],
|
||||
[12, "12.0E+0"],
|
||||
[123, "123.0E+0"],
|
||||
[1234, "1.2E+3"],
|
||||
[12345, "12.3E+3"],
|
||||
[123456, "123.5E+3"],
|
||||
[1234567, "1.2E+6"],
|
||||
[12345678, "12.3E+6"],
|
||||
[123456789, "123.5E+6"]
|
||||
],
|
||||
["0#######0.##0##0######00######0",
|
||||
[12.3456789, "012.3456789000"],
|
||||
[123456789, "123456789.00000"]
|
||||
],
|
||||
["###\\###\\##0.00",
|
||||
[0.00101, "##0.00"],
|
||||
[0.0101, "##0.01"],
|
||||
[0.101, "##0.10"],
|
||||
[1.01, "##1.01"],
|
||||
[10.1, "##10.10"],
|
||||
[101, "#1#01.00"],
|
||||
[1010, "#10#10.00"],
|
||||
[10100, "1#01#00.00"],
|
||||
[101000, "10#10#00.00"],
|
||||
[1010000, "101#00#00.00"],
|
||||
[10100000, "1010#00#00.00"],
|
||||
[101000000, "10100#00#00.00"],
|
||||
[123456789.01, "12345#67#89.01"]
|
||||
],
|
||||
|
||||
["###\\\\###\\\\##\\0.00",
|
||||
[0.00101, "\\\\0.00"],
|
||||
[0.0101, "\\\\0.01"],
|
||||
[0.101, "\\\\0.10"],
|
||||
[1.01, "\\\\10.01"],
|
||||
[10.1, "\\\\100.10"],
|
||||
[101, "\\1\\010.00"],
|
||||
[1010, "\\10\\100.00"],
|
||||
[10100, "\\101\\000.00"],
|
||||
[101000, "1\\010\\000.00"],
|
||||
[1010000, "10\\100\\000.00"],
|
||||
[10100000, "101\\000\\000.00"],
|
||||
[101000000, "1010\\000\\000.00"],
|
||||
[123456789.01, "1234\\567\\890.01"]
|
||||
],
|
||||
["0.0#",
|
||||
[12345.0, "12345.0"],
|
||||
[1234.5, "1234.5"],
|
||||
[123.45, "123.45"],
|
||||
[12.345, "12.35"],
|
||||
[1.2345, "1.23"],
|
||||
[0.12345, "0.12"],
|
||||
[0.012345, "0.01"],
|
||||
[0.0012345, "0.0"],
|
||||
[0.00012345, "0.0"],
|
||||
[15.04, "15.04"],
|
||||
[15.06, "15.06"]
|
||||
],
|
||||
["###\\\\###\\\\##\\0", [12345.6789, "\\123\\460"]],
|
||||
["00000-0000", [941051630, "94105-1630"], [12345.6789, "00001-2346"]],
|
||||
["000-00-0000", [123456789, "123-45-6789"]],
|
||||
["00000\\-0000", [941051630, "94105-1630"]],
|
||||
["000\\-00\\-0000", [123456789, "123-45-6789"]],
|
||||
["??/??", [12.3456789, "1000/81"], [0.00001, " 0/1 "]],
|
||||
["# ??/??", [12.3456789, "12 28/81"]],
|
||||
["#??/??", [12.3456789, "1000/81"]],
|
||||
["#0#00??/??", [12.3456789, "01000/81"]],
|
||||
["[<=9999999]###-####;(###) ###-####", [8675309, "867-5309"],[2813308004, "(281) 330-8004"], [2018675309, "(201) 867-5309"]],
|
||||
["[<=9999999]###\\-####;(###) ###\\-####", [8675309, "867-5309"],[2813308004, "(281) 330-8004"]],
|
||||
["[Red][<-25]General;[Blue][>25]General;[Green]General;[Yellow]General", [50, "50"],[26, "26"],[25,"25"],[1,"1"],[0,"0"],[-1,"-1"],[-25,"-25"],[-26,"26","#"],[-50.1,"50","#"], ["foo","foo"],["bar","bar"]],
|
||||
["[Red][<=-25]General;[Blue][>=25]General;[Green]General;[Yellow]General", [50, "50"],[26, "26"],[25,"25"],[1,"1"],[0,"0"],[-1,"-1"],[-25,"-25"],[-26.1,"26","#"],[-50,"50","#"], ["foo","foo"],["bar","bar"]],
|
||||
["[Red]General ;[Blue]General\\ ;[Green]Generalp;[Yellow]General'", [50, "50 "],[0,"0p"],[-25,"-25 "],["foo","foo'"]],
|
||||
["[Red][=50]General;[Blue]000", [50, "50"], [51, "051"], [49, "049"]],
|
||||
["[Red][<>50]General;[Blue]000", [50, "050"], [51, "51"], [49, "49"]],
|
||||
["b", [1,"43"], [1000,"45"], [10000,"70"]],
|
||||
["B2yyyymmdd", [0,"13170829"], [1000,"13200624","#"], [10000,"13451117","#"]],
|
||||
["☃", [0], [1], [-1]],
|
||||
["#0#######", [12345, "012345"], [12345.4321, "012345"], [12345.6789, "012346"]],
|
||||
["##,##", [12345, "12,345", ""], [12345.4321, "12,345", ""], [12345.6789, "12,346", ""]],
|
||||
[0, [12345,"12345"], [4294967296.5, "4294967297"]],
|
||||
["\"Rs.\"#,##0.00", [-51968287, "-Rs.51,968,287.00"], [2000000, "Rs.2,000,000.00"]],
|
||||
["$#.00", [3.14159, "$3.14"], [-3.14159, "-$3.14"]],
|
||||
["\"This is a \".00\"test\"000", [-3.14159, "-This is a 3.14test159"], [3.14159, "This is a 3.14test159"]],
|
||||
["[$INR]\\ #,##0.00", [3.14159, "INR 3.14"], [-3.14159, "-INR 3.14"]],
|
||||
["[$₹-4009]\\ #,##0.00", [3.14159, "₹ 3.14"], [-3.14159, "-₹ 3.14"]],
|
||||
["[$£-809]#,##0.0000;\\-[$£-809]#,##0.0000", [3.14159, "£3.1416"], [-3.14159, "-£3.1416"]],
|
||||
["\"-\"0.00", [3.14159, "-3.14"], [-3.14159, "--3.14"]],
|
||||
["[$-409]mmm\\-yy", [12345, "Oct-33"]],
|
||||
|
||||
["\\,##.??;\\(#,###.??\\);0", [15,",15. ","#"], [14.3453453,",14.35","#"], [12.1,",12.1 ","#"], [0,"0","#"], [-15,"(15. )","#"], [-14.3453453,"(14.35)","#"], [-12.1,"(12.1 )","#"], [1,",1. ","#"]],
|
||||
["\"£\"#.####;-\"£\"#.####", [3.141592654, "£3.1416"], [-3.141592654, "-£3.1416"]],
|
||||
["[h]:mm:ss;@", [2.9999999999999996, "72:00:00"]],
|
||||
["hh:mm:ss AM/PM", [0.5, "12:00:00 PM"]],
|
||||
["hh:mm:ss am/pm", [0.5, "12:00:00 PM"]],
|
||||
["hh:mm:ss AM/P", [0.5, "12:00:00 A1/P"]],
|
||||
["hh:mm:ss am/p", [0.5, "12:00:00 a1/p"]],
|
||||
["\"foo\";\"bar\";\"baz\";\"qux\";\"foobar\"", [1], [0], [-1], ["sheetjs"]]
|
||||
]
|
1048576
packages/ssf/test/times.tsv
Normal file
1048576
packages/ssf/test/times.tsv
Normal file
File diff suppressed because it is too large
Load Diff
10
packages/ssf/test/utilities.js
Normal file
10
packages/ssf/test/utilities.js
Normal file
@ -0,0 +1,10 @@
|
||||
/* vim: set ts=2: */
|
||||
/*jshint loopfunc:true, mocha:true, node:true */
|
||||
var SSF = require('../');
|
||||
var fs = require('fs'), assert = require('assert');
|
||||
var is_date = JSON.parse(fs.readFileSync('./test/is_date.json','utf8'));
|
||||
describe('utilities', function() {
|
||||
it('correctly determines if formats are dates', function() {
|
||||
is_date.forEach(function(d) { assert.equal(SSF.is_date(d[0]), d[1], d[0]); });
|
||||
});
|
||||
});
|
19
packages/ssf/test/valid.js
Normal file
19
packages/ssf/test/valid.js
Normal file
@ -0,0 +1,19 @@
|
||||
/* vim: set ts=2: */
|
||||
/*jshint loopfunc:true, mocha:true, node:true */
|
||||
var SSF = require('../');
|
||||
var fs = require('fs');
|
||||
var data = fs.readFileSync('./test/valid.tsv','utf8').split("\n");
|
||||
var _data = [0, 1, -2, 3.45, -67.89, "foo"];
|
||||
function doit(d) {
|
||||
it(d[0], function() {
|
||||
for(var w = 0; w < _data.length; ++w) {
|
||||
SSF.format(d[0], _data[w]);
|
||||
}
|
||||
});
|
||||
}
|
||||
describe('valid formats', function() {
|
||||
for(var j=0;j<data.length;++j) {
|
||||
if(!data[j]) return;
|
||||
doit(data[j].replace(/#{255}/g,"").split("\t"));
|
||||
}
|
||||
});
|
442
packages/ssf/test/valid.tsv
Normal file
442
packages/ssf/test/valid.tsv
Normal file
@ -0,0 +1,442 @@
|
||||
" Excellent"
|
||||
" Fair"
|
||||
" Good"
|
||||
" Poor"
|
||||
" Very Good"
|
||||
"$"#,##0
|
||||
"$"#,##0.00
|
||||
"$"#,##0.00_);[Red]\("$"#,##0.00\)
|
||||
"$"#,##0.00_);\("$"#,##0.00\)
|
||||
"$"#,##0;[Red]\-"$"#,##0
|
||||
"$"#,##0_);[Red]\("$"#,##0\)
|
||||
"$"#,##0_);\("$"#,##0\)
|
||||
"Haha!"\ @\ "Yeah!"
|
||||
"TRUE";"TRUE";"FALSE"
|
||||
"True";"True";"False";@
|
||||
"Years: "0
|
||||
"Yes";"Yes";"No";@
|
||||
"kl "hh:mm:ss;@
|
||||
"£"#,##0.00
|
||||
"£"#,##0;[Red]\-"£"#,##0
|
||||
"€"#,##0.00
|
||||
"€"\ #,##0.00_-
|
||||
"上午/下午 "hh"時"mm"分"ss"秒 "
|
||||
"¥"#,##0.00;"¥"\-#,##0.00
|
||||
#
|
||||
# ?/?
|
||||
# ??/??
|
||||
#" "?/?
|
||||
#" "??/??
|
||||
#"abded"\ ??/??
|
||||
###0.00;-###0.00
|
||||
###0;-###0
|
||||
##0.0E+0
|
||||
#,##0
|
||||
#,##0 ;(#,##0)
|
||||
#,##0 ;[Red](#,##0)
|
||||
#,##0"р.";[Red]\-#,##0"р."
|
||||
#,##0.0
|
||||
#,##0.00
|
||||
#,##0.00 "<22>"
|
||||
#,##0.00 €;-#,##0.00 €
|
||||
#,##0.00"р.";[Red]\-#,##0.00"р."
|
||||
#,##0.000
|
||||
#,##0.0000
|
||||
#,##0.00000
|
||||
#,##0.000000
|
||||
#,##0.0000000
|
||||
#,##0.00000000
|
||||
#,##0.000000000
|
||||
#,##0.00000000;[Red]#,##0.00000000
|
||||
#,##0.0000_
|
||||
#,##0.000_
|
||||
#,##0.000_);\(#,##0.000\)
|
||||
#,##0.00;(#,##0.00)
|
||||
#,##0.00;(#,##0.00);0.00
|
||||
#,##0.00;[Red](#,##0.00)
|
||||
#,##0.00;[Red]\(#,##0.00\)
|
||||
#,##0.00;\(#,##0.00\)
|
||||
#,##0.00[$₹-449]_);\(#,##0.00[$₹-449]\)
|
||||
#,##0.00\ "р."
|
||||
#,##0.00\ "р.";[Red]\-#,##0.00\ "р."
|
||||
#,##0.00\ [$€-407]
|
||||
#,##0.00\ [$€-40C]
|
||||
#,##0.00_);\(#,##0.00\)
|
||||
#,##0.00_р_.;[Red]\-#,##0.00_р_.
|
||||
#,##0.00_р_.;\-#,##0.00_р_.
|
||||
#,##0.0;[Red]#,##0.0
|
||||
#,##0.0_ ;\-#,##0.0\
|
||||
#,##0.0_);[Red]\(#,##0.0\)
|
||||
#,##0.0_);\(#,##0.0\)
|
||||
#,##0;\-#,##0;0
|
||||
#,##0\ "р.";[Red]\-#,##0\ "р."
|
||||
#,##0\ "р.";\-#,##0\ "р."
|
||||
#,##0\ ;[Red]\(#,##0\)
|
||||
#,##0\ ;\(#,##0\)
|
||||
#,##0_
|
||||
#,##0_ ;[Red]\-#,##0\
|
||||
#,##0_);[Red]\(#,##0\)
|
||||
#,##0_р_.;[Red]\-#,##0_р_.
|
||||
#,##0_р_.;\-#,##0_р_.
|
||||
#.0000,,
|
||||
#0
|
||||
#0.00
|
||||
#0.0000
|
||||
#\ ?/10
|
||||
#\ ?/2
|
||||
#\ ?/4
|
||||
#\ ?/8
|
||||
#\ ?/?
|
||||
#\ ??/100
|
||||
#\ ??/100;[Red]\(#\ ??/16\)
|
||||
#\ ??/16
|
||||
#\ ??/??
|
||||
#\ ??/?????????
|
||||
#\ ???/???
|
||||
**\ #,###,#00,000.00,**
|
||||
0
|
||||
0"abde".0"??"000E+00
|
||||
0%
|
||||
0.0
|
||||
0.0%
|
||||
0.00
|
||||
0.00"°"
|
||||
0.00%
|
||||
0.000
|
||||
0.000%
|
||||
0.0000
|
||||
0.000000
|
||||
0.00000000
|
||||
0.000000000
|
||||
0.000000000%
|
||||
0.00000000000
|
||||
0.000000000000000
|
||||
0.00000000E+00
|
||||
0.0000E+00
|
||||
0.00;[Red]0.00
|
||||
0.00E+00
|
||||
0.00_);[Red]\(0.00\)
|
||||
0.00_);\(0.00\)
|
||||
0.0_
|
||||
00.00.00.000
|
||||
00.000%
|
||||
0000
|
||||
00000
|
||||
00000000
|
||||
000000000
|
||||
00000\-0000
|
||||
00000\-00000
|
||||
000\-00\-0000
|
||||
0;[Red]0
|
||||
0\-00000\-00000\-0
|
||||
0_);[Red]\(0\)
|
||||
0_);\(0\)
|
||||
@
|
||||
A/P
|
||||
AM/PM
|
||||
AM/PMh"時"mm"分"ss"秒";@
|
||||
D
|
||||
DD
|
||||
DD/MM/YY;@
|
||||
DD/MM/YYYY
|
||||
DD/MM/YYYY;@
|
||||
DDD
|
||||
DDDD
|
||||
DDDD", "MMMM\ DD", "YYYY
|
||||
GENERAL
|
||||
General
|
||||
H
|
||||
H:MM:SS\ AM/PM
|
||||
HH:MM
|
||||
HH:MM:SS\ AM/PM
|
||||
HHM
|
||||
HHMM
|
||||
HH[MM]
|
||||
HH[M]
|
||||
M/D/YYYY
|
||||
M/D/YYYY\ H:MM
|
||||
MM/DD/YY
|
||||
S
|
||||
SS
|
||||
YY
|
||||
YYM
|
||||
YYMM
|
||||
YYMMM
|
||||
YYMMMM
|
||||
YYMMMMM
|
||||
YYYY
|
||||
YYYY-MM-DD HH:MM:SS
|
||||
YYYY\-MM\-DD
|
||||
[$$-409]#,##0
|
||||
[$$-409]#,##0.00
|
||||
[$$-409]#,##0.00_);[Red]\([$$-409]#,##0.00\)
|
||||
[$$-C09]#,##0.00
|
||||
[$-100042A]h:mm:ss\ AM/PM;@
|
||||
[$-1010409]0.000%
|
||||
[$-1010409]General
|
||||
[$-1010409]d/m/yyyy\ h:mm\ AM/PM;@
|
||||
[$-1010409]dddd, mmmm dd, yyyy
|
||||
[$-1010409]m/d/yyyy
|
||||
[$-1409]h:mm:ss\ AM/PM;@
|
||||
[$-2000000]h:mm:ss;@
|
||||
[$-2010401]d/mm/yyyy\ h:mm\ AM/PM;@
|
||||
[$-4000439]h:mm:ss\ AM/PM;@
|
||||
[$-4010439]d/m/yyyy\ h:mm\ AM/PM;@
|
||||
[$-409]AM/PM\ hh:mm:ss;@
|
||||
[$-409]d/m/yyyy\ hh:mm;@
|
||||
[$-409]d\-mmm;@
|
||||
[$-409]d\-mmm\-yy;@
|
||||
[$-409]d\-mmm\-yyyy;@
|
||||
[$-409]dd/mm/yyyy\ hh:mm;@
|
||||
[$-409]dd\-mmm\-yy;@
|
||||
[$-409]h:mm:ss\ AM/PM;@
|
||||
[$-409]h:mm\ AM/PM;@
|
||||
[$-409]m/d/yy\ h:mm\ AM/PM;@
|
||||
[$-409]mmm\-yy;@
|
||||
[$-409]mmmm\ d\,\ yyyy;@
|
||||
[$-409]mmmm\-yy;@
|
||||
[$-409]mmmmm;@
|
||||
[$-409]mmmmm\-yy;@
|
||||
[$-40E]h\ "óra"\ m\ "perckor"\ AM/PM;@
|
||||
[$-412]AM/PM\ h"시"\ mm"분"\ ss"초";@
|
||||
[$-41C]h:mm:ss\.AM/PM;@
|
||||
[$-449]hh:mm:ss\ AM/PM;@
|
||||
[$-44E]hh:mm:ss\ AM/PM;@
|
||||
[$-44F]hh:mm:ss\ AM/PM;@
|
||||
[$-D000409]h:mm\ AM/PM;@
|
||||
[$-D010000]d/mm/yyyy\ h:mm\ "น.";@
|
||||
[$-F400]h:mm:ss\ AM/PM
|
||||
[$-F800]dddd\,\ mmmm\ dd\,\ yyyy
|
||||
[$AUD]\ #,##0.00
|
||||
[$RD$-1C0A]#,##0.00;[Red]\-[$RD$-1C0A]#,##0.00
|
||||
[$SFr.-810]\ #,##0.00_);[Red]\([$SFr.-810]\ #,##0.00\)
|
||||
[$£-809]#,##0.00;[Red][$£-809]#,##0.00
|
||||
[$¥-411]#,##0.00
|
||||
[$¥-804]#,##0.00
|
||||
[<0]"";0%
|
||||
[<=9999999]###\-####;\(###\)\ ###\-####
|
||||
[=0]?;#,##0.00
|
||||
[=0]?;0%
|
||||
[=0]?;[<4.16666666666667][hh]:mm:ss;[hh]:mm
|
||||
[>999999]#,,"M";[>999]#,"K";#
|
||||
[>999999]#.000,,"M";[>999]#.000,"K";#.000
|
||||
[>=100000]0.000\ \";[Red]0.000\ \<\ \>\ \"\ \&\ \'\
|
||||
[>=100000]0.000\ \<;[Red]0.000\ \>
|
||||
[BLACK]@
|
||||
[BLUE]GENERAL
|
||||
[Black]@
|
||||
[Blue]General
|
||||
[CYAN]@
|
||||
[Cyan]@
|
||||
[DBNum1][$-804]AM/PMh"时"mm"分";@
|
||||
[DBNum1][$-804]General
|
||||
[DBNum1][$-804]h"时"mm"分";@
|
||||
[ENG][$-1004]dddd\,\ d\ mmmm\,\ yyyy;@
|
||||
[ENG][$-101040D]d\ mmmm\ yyyy;@
|
||||
[ENG][$-101042A]d\ mmmm\ yyyy;@
|
||||
[ENG][$-140C]dddd\ "YeahWoo!"\ ddd\ mmmm\ yyyy;@
|
||||
[ENG][$-2C0A]dddd\ d" de "mmmm" de "yyyy;@
|
||||
[ENG][$-402]dd\ mmmm\ yyyy\ "г.";@
|
||||
[ENG][$-403]dddd\,\ d" / "mmmm" / "yyyy;@
|
||||
[ENG][$-405]d\.\ mmmm\ yyyy;@
|
||||
[ENG][$-408]d\ mmmm\ yyyy;@
|
||||
[ENG][$-409]d\-mmm;@
|
||||
[ENG][$-409]d\-mmm\-yy;@
|
||||
[ENG][$-409]d\-mmm\-yyyy;@
|
||||
[ENG][$-409]dd\-mmm\-yy;@
|
||||
[ENG][$-409]mmm\-yy;@
|
||||
[ENG][$-409]mmmm\ d\,\ yyyy;@
|
||||
[ENG][$-409]mmmm\-yy;@
|
||||
[ENG][$-40B]d\.\ mmmm\t\a\ yyyy;@
|
||||
[ENG][$-40C]d/mmm/yyyy;@
|
||||
[ENG][$-40E]yyyy/\ mmmm\ d\.;@
|
||||
[ENG][$-40F]dd\.\ mmmm\ yyyy;@
|
||||
[ENG][$-410]d\ mmmm\ yyyy;@
|
||||
[ENG][$-415]d\ mmmm\ yyyy;@
|
||||
[ENG][$-416]d\ \ mmmm\,\ yyyy;@
|
||||
[ENG][$-418]d\ mmmm\ yyyy;@
|
||||
[ENG][$-41A]d\.\ mmmm\ yyyy\.;@
|
||||
[ENG][$-41B]d\.\ mmmm\ yyyy;@
|
||||
[ENG][$-41D]"den "\ d\ mmmm\ yyyy;@
|
||||
[ENG][$-420]dddd\,\ dd\ mmmm\,\ yyyy;@
|
||||
[ENG][$-421]dd\ mmmm\ yyyy;@
|
||||
[ENG][$-424]dddd\,\ d\.\ mmmm\ yyyy;@
|
||||
[ENG][$-425]dddd\,\ d\.\ mmmm\ yyyy;@
|
||||
[ENG][$-426]dddd\,\ yyyy". gada "d\.\ mmmm;@
|
||||
[ENG][$-427]yyyy\ "m."\ mmmm\ d\ "d.";@
|
||||
[ENG][$-42B]dddd\,\ d\ mmmm\ yyyy;@
|
||||
[ENG][$-42C]d\ mmmm\ yyyy;@
|
||||
[ENG][$-42D]yyyy"(e)ko"\ mmmm"ren"\ d"a";@
|
||||
[ENG][$-42F]dddd\,\ dd\ mmmm\ yyyy;@
|
||||
[ENG][$-437]yyyy\ \წ\ლ\ი\ს\ dd\ mm\,\ dddd;@
|
||||
[ENG][$-438]d\.\ mmmm\ yyyy;@
|
||||
[ENG][$-43F]d\ mmmm\ yyyy\ "ж.";@
|
||||
[ENG][$-444]d\ mmmm\ yyyy;@
|
||||
[ENG][$-449]dd\ mmmm\ yyyy;@
|
||||
[ENG][$-44E]d\ mmmm\ yyyy;@
|
||||
[ENG][$-44F]dd\ mmmm\ yyyy\ dddd;@
|
||||
[ENG][$-457]dd\ mmmm\ yyyy;@
|
||||
[ENG][$-813]dddd\ d\ mmmm\ yyyy;@
|
||||
[ENG][$-81A]dddd\,\ d\.\ mmmm\ yyyy;@
|
||||
[ENG][$-82C]d\ mmmm\ yyyy;@
|
||||
[ENG][$-843]yyyy\ "й""и""л"\ d/mmmm;@
|
||||
[ENG][$-C07]dddd\,\ dd\.\ mmmm\ yyyy;@
|
||||
[ENG][$-FC19]yyyy\,\ dd\ mmmm;@
|
||||
[ENG][$-FC22]d\ mmmm\ yyyy" р.";@
|
||||
[ENG][$-FC23]d\ mmmm\ yyyy;@
|
||||
[GREEN]#,###
|
||||
[Green]#,###
|
||||
[HH]
|
||||
[HIJ][$-2060401]d/mm/yyyy\ h:mm\ AM/PM;@
|
||||
[HIJ][$-2060401]d\ mmmm\ yyyy;@
|
||||
[H]
|
||||
[JPN][$-411]gggyy"年"m"月"d"日"\ dddd;@
|
||||
[MAGENTA]0.00
|
||||
[Magenta]0.00
|
||||
[RED]#.##
|
||||
[Red]#.##
|
||||
[Red][<-25]General;[Blue][>25]General;[Green]General;[Yellow]General\
|
||||
[Red][<=-25]General;[Blue][>=25]General;[Green]General;[Yellow]General
|
||||
[Red][<>50]General;[Blue]000
|
||||
[Red][=50]General;[Blue]000
|
||||
[SS]
|
||||
[S]
|
||||
[TWN][DBNum1][$-404]y"年"m"月"d"日";@
|
||||
[WHITE]0.0
|
||||
[White]0.0
|
||||
[YELLOW]@
|
||||
[Yellow]@
|
||||
[h]
|
||||
[h]:mm:ss
|
||||
[h]:mm:ss;@
|
||||
[h]\.mm" Uhr ";@
|
||||
[hh]
|
||||
[s]
|
||||
[ss]
|
||||
\#\r\e\c
|
||||
\$#,##0_);[Red]"($"#,##0\)
|
||||
\$0.00
|
||||
\C\O\B\ \o\n\ @
|
||||
\C\R\O\N\T\A\B\ \o\n\ @
|
||||
\R\e\s\u\l\t\ \o\n\ @
|
||||
\S\Q\L\ \:\ @
|
||||
\S\Q\L\ \R\e\q\u\e\s\t\ \f\o\r\ @
|
||||
\c\c\c?????0"aaaa"0"bbbb"000000.00%
|
||||
\u\n\t\i\l\ h:mm;@
|
||||
_ "¥"* #,##0.00_ "Positive";_ "¥"* \-#,##0.00_ ;_ "¥"* "-"??_ "Negtive";_ @_ \ "Zero"
|
||||
_ * #,##0.00_)[$﷼-429]_ ;_ * \(#,##0.00\)[$﷼-429]_ ;_ * "-"??_)[$﷼-429]_ ;_ @_
|
||||
_ * #,##0_ ;_ * \-#,##0_ ;[Red]_ * "-"_ ;_ @_
|
||||
_("$"* #,##0.00_);_("$"* \(#,##0.00\);_("$"* "-"??_);_(@_)
|
||||
_("$"* #,##0_);_("$"* \(#,##0\);_("$"* "-"??_);_(@_)
|
||||
_("$"* #,##0_);_("$"* \(#,##0\);_("$"* "-"_);_(@_)
|
||||
_(* #,##0.0000_);_(* \(#,##0.0000\);_(* "-"??_);_(@_)
|
||||
_(* #,##0.000_);_(* \(#,##0.000\);_(* "-"??_);_(@_)
|
||||
_(* #,##0.00_);_(* \(#,##0.00\);_(* "-"??_);_(@_)
|
||||
_(* #,##0.0_);_(* \(#,##0.0\);_(* "-"??_);_(@_)
|
||||
_(* #,##0_);_(* \(#,##0\);_(* "-"??_);_(@_)
|
||||
_(* #,##0_);_(* \(#,##0\);_(* "-"_);_(@_)
|
||||
_([$ANG]\ * #,##0.0_);_([$ANG]\ * \(#,##0.0\);_([$ANG]\ * "-"?_);_(@_)
|
||||
_-"€"\ * #,##0.00_-;_-"€"\ * #,##0.00\-;_-"€"\ * "-"??_-;_-@_-
|
||||
_-* #,##0.00" TL"_-;\-* #,##0.00" TL"_-;_-* \-??" TL"_-;_-@_-
|
||||
_-* #,##0.00" €"_-;\-* #,##0.00" €"_-;_-* \-??" €"_-;_-@_-
|
||||
_-* #,##0.00\ "р."_-;\-* #,##0.00\ "р."_-;_-* "-"??\ "р."_-;_-@_-
|
||||
_-* #,##0.00\ "€"_-;\-* #,##0.00\ "€"_-;_-* "-"??\ "€"_-;_-@_-
|
||||
_-* #,##0.00\ [$€-407]_-;\-* #,##0.00\ [$€-407]_-;_-* \-??\ [$€-407]_-;_-@_-
|
||||
_-* #,##0.0\ _F_-;\-* #,##0.0\ _F_-;_-* "-"??\ _F_-;_-@_-
|
||||
_-* #,##0\ "€"_-;\-* #,##0\ "€"_-;_-* "-"\ "€"_-;_-@_-
|
||||
_-* #,##0_-;\-* #,##0_-;_-* "-"??_-;_-@_-
|
||||
_-\$* #,##0.0_ ;_-\$* \-#,##0.0\ ;_-\$* "-"?_ ;_-@_
|
||||
d
|
||||
d-mmm
|
||||
d-mmm-yy
|
||||
d/m
|
||||
d/m/yy;@
|
||||
d/m/yyyy;@
|
||||
d/mm/yy;@
|
||||
d/mm/yyyy;@
|
||||
d\-mmm
|
||||
d\-mmm\-yyyy
|
||||
dd
|
||||
dd"-"mmm"-"yyyy
|
||||
dd/m/yyyy
|
||||
dd/mm/yy
|
||||
dd/mm/yy;@
|
||||
dd/mm/yy\ hh:mm
|
||||
dd/mm/yyyy
|
||||
dd/mm/yyyy\ hh:mm:ss
|
||||
dd/mmm
|
||||
dd\-mm\-yy
|
||||
dd\-mmm\-yy
|
||||
dd\-mmm\-yyyy\ hh:mm:ss.000
|
||||
dd\/mm\/yy
|
||||
dd\/mm\/yyyy
|
||||
ddd
|
||||
dddd
|
||||
dddd, mmmm dd, yyyy
|
||||
h
|
||||
h"时"mm"分"ss"秒";@
|
||||
h"時"mm"分"ss"秒";@
|
||||
h:mm
|
||||
h:mm AM/PM
|
||||
h:mm:ss
|
||||
h:mm:ss AM/PM
|
||||
h:mm:ss;@
|
||||
h:mm;@
|
||||
h\.mm" Uhr ";@
|
||||
h\.mm" h";@
|
||||
h\.mm" u.";@
|
||||
hh":"mm AM/PM
|
||||
hh:mm:ss
|
||||
hh:mm:ss\ AM/PM
|
||||
hh\.mm" h";@
|
||||
hhm
|
||||
hhmm
|
||||
m"月"d"日"
|
||||
m/d/yy
|
||||
m/d/yy h:mm
|
||||
m/d/yy;@
|
||||
m/d/yy\ h:mm
|
||||
m/d/yy\ h:mm;@
|
||||
m/d/yyyy
|
||||
m/d/yyyy;@
|
||||
m/d/yyyy\ h:mm:ss;@
|
||||
m/d;@
|
||||
m\/d\/yyyy
|
||||
mm/dd
|
||||
mm/dd/yy
|
||||
mm/dd/yy;@
|
||||
mm/dd/yyyy
|
||||
mm:ss
|
||||
mm:ss.0;@
|
||||
mmm d, yyyy
|
||||
mmm" "d", "yyyy
|
||||
mmm-yy
|
||||
mmm-yy;@
|
||||
mmm/yy
|
||||
mmm\-yy
|
||||
mmm\-yy;@
|
||||
mmm\-yyyy
|
||||
mmmm\ d\,\ yyyy
|
||||
mmmm\ yyyy
|
||||
mmss.0
|
||||
s
|
||||
ss
|
||||
yy
|
||||
yy/mm/dd
|
||||
yy\.mm\.dd
|
||||
yym
|
||||
yymm
|
||||
yymmm
|
||||
yymmmm
|
||||
yymmmmm
|
||||
yyyy
|
||||
yyyy"년"\ m"월"\ d"일";@
|
||||
yyyy-m-d h:mm AM/PM
|
||||
yyyy-mm-dd
|
||||
yyyy/mm/dd
|
||||
yyyy\-m\-d\ hh:mm:ss
|
||||
yyyy\-mm\-dd
|
||||
yyyy\-mm\-dd;@
|
||||
yyyy\-mm\-dd\ h:mm
|
||||
yyyy\-mm\-dd\Thh:mm
|
||||
yyyy\-mm\-dd\Thhmmss.000
|
Can't render this file because it contains an unexpected character in line 6 and column 3.
|
5
packages/ssf/types/.npmignore
Normal file
5
packages/ssf/types/.npmignore
Normal file
@ -0,0 +1,5 @@
|
||||
Makefile
|
||||
*ssf*.ts
|
||||
doc.ts
|
||||
write.ts
|
||||
tslint.json
|
13
packages/ssf/types/bin_ssf.ts
Executable file
13
packages/ssf/types/bin_ssf.ts
Executable file
@ -0,0 +1,13 @@
|
||||
/* ssf.js (C) 2013-present SheetJS -- http://sheetjs.com */
|
||||
/* eslint-env node */
|
||||
/* eslint no-console:0 */
|
||||
/*jshint node:true */
|
||||
/// <reference types="../node_modules/@types/node/" />
|
||||
import X = require('ssf');
|
||||
const argv = process.argv.slice(2);
|
||||
if(argv.length < 2 || argv[0] === "-h" || argv[0] === "--help") {
|
||||
console.error("usage: ssf <format> <value>");
|
||||
console.error("output: format_as_string|format_as_number|");
|
||||
process.exit(0);
|
||||
}
|
||||
console.log(X.format(argv[0],argv[1]) + "|" + X.format(argv[0],+(argv[1])) + "|");
|
56
packages/ssf/types/index.d.ts
vendored
Normal file
56
packages/ssf/types/index.d.ts
vendored
Normal file
@ -0,0 +1,56 @@
|
||||
/* ssf.js (C) 2013-present SheetJS -- http://sheetjs.com */
|
||||
// TypeScript Version: 2.2
|
||||
|
||||
/** Version string */
|
||||
export const version: string;
|
||||
|
||||
/** Render value using format string or code */
|
||||
export function format(fmt: string|number, val: any, opts?: any): string;
|
||||
|
||||
/** Load format string */
|
||||
export function load(fmt: string, idx?: number): number;
|
||||
|
||||
/** Test if the format is a Date format */
|
||||
export function is_date(fmt: string): boolean;
|
||||
|
||||
|
||||
/** Format Table */
|
||||
export interface SSF$Table {
|
||||
[key: number]: string;
|
||||
[key: string]: string;
|
||||
}
|
||||
|
||||
/** Get format table */
|
||||
export function get_table(): SSF$Table;
|
||||
|
||||
/** Set format table */
|
||||
export function load_table(tbl: SSF$Table): void;
|
||||
|
||||
|
||||
/** Parsed date */
|
||||
export interface SSF$Date {
|
||||
/** number of whole days since relevant epoch, 0 <= D */
|
||||
D: number;
|
||||
/** integral year portion, epoch_year <= y */
|
||||
y: number;
|
||||
/** integral month portion, 1 <= m <= 12 */
|
||||
m: number;
|
||||
/** integral day portion, subject to gregorian YMD constraints */
|
||||
d: number;
|
||||
/** integral day of week (0=Sunday .. 6=Saturday) 0 <= q <= 6 */
|
||||
q: number;
|
||||
|
||||
/** number of seconds since midnight, 0 <= T < 86400 */
|
||||
T: number;
|
||||
/** integral number of hours since midnight, 0 <= H < 24 */
|
||||
H: number;
|
||||
/** integral number of minutes since the last hour, 0 <= M < 60 */
|
||||
M: number;
|
||||
/** integral number of seconds since the last minute, 0 <= S < 60 */
|
||||
S: number;
|
||||
/** sub-second part of time, 0 <= u < 1 */
|
||||
u: number;
|
||||
}
|
||||
|
||||
/** Parse numeric date code */
|
||||
export function parse_date_code(v: number, opts?: any): SSF$Date;
|
16
packages/ssf/types/ssf-test.ts
Normal file
16
packages/ssf/types/ssf-test.ts
Normal file
@ -0,0 +1,16 @@
|
||||
import { format, load, get_table, load_table, parse_date_code, is_date, SSF$Table, SSF$Date } from 'ssf';
|
||||
|
||||
const t1: string = format("General", 123.456);
|
||||
const t2: string = format(0, 234.567);
|
||||
const t3: string = format("@", "1234.567");
|
||||
|
||||
load('"This is "0.00', 70);
|
||||
load('"This is "0');
|
||||
|
||||
const tbl: SSF$Table = get_table();
|
||||
load_table(tbl);
|
||||
|
||||
const date: SSF$Date = parse_date_code(43150);
|
||||
const sum: number = date.D + date.T + date.y + date.m + date.d + date.H + date.M + date.S + date.q + date.u;
|
||||
|
||||
const isdate: boolean = is_date("YYYY-MM-DD");
|
15
packages/ssf/types/tsconfig.json
Normal file
15
packages/ssf/types/tsconfig.json
Normal file
@ -0,0 +1,15 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"module": "commonjs",
|
||||
"lib": [ "es5" ],
|
||||
"noImplicitAny": true,
|
||||
"noImplicitThis": true,
|
||||
"strictNullChecks": false,
|
||||
"baseUrl": ".",
|
||||
"paths": { "ssf": ["."] },
|
||||
"types": [],
|
||||
"noEmit": true,
|
||||
"strictFunctionTypes": true,
|
||||
"forceConsistentCasingInFileNames": true
|
||||
}
|
||||
}
|
18
packages/ssf/types/tslint.json
Normal file
18
packages/ssf/types/tslint.json
Normal file
@ -0,0 +1,18 @@
|
||||
{
|
||||
"extends": "dtslint/dtslint.json",
|
||||
"rules": {
|
||||
"no-implicit-dependencies": false,
|
||||
"whitespace": false,
|
||||
"no-sparse-arrays": false,
|
||||
"only-arrow-functions": false,
|
||||
"no-consecutive-blank-lines": false,
|
||||
"prefer-conditional-expression": false,
|
||||
"one-variable-per-declaration": false,
|
||||
"strict-export-declare-modifiers": false,
|
||||
"no-redundant-jsdoc": false,
|
||||
"no-any-union": false,
|
||||
"no-unnecessary-generics": false,
|
||||
"no-unnecessary-type-assertion": false,
|
||||
"prefer-template": false
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user