ui-formatter 0.0.8 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/index.js +127 -89
- package/package.json +1 -1
- package/src/index.ts +163 -87
package/lib/index.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
var et = "";
|
|
4
4
|
function getDateFormat(profile) {
|
|
5
|
-
return "M/
|
|
5
|
+
return "M/d/yyyy";
|
|
6
6
|
}
|
|
7
7
|
exports.getDateFormat = getDateFormat;
|
|
8
8
|
function addDays(d, n) {
|
|
@@ -11,73 +11,58 @@ function addDays(d, n) {
|
|
|
11
11
|
return newDate;
|
|
12
12
|
}
|
|
13
13
|
exports.addDays = addDays;
|
|
14
|
-
function formatDate(d,
|
|
15
|
-
if (!d) {
|
|
16
|
-
return
|
|
17
|
-
}
|
|
18
|
-
var format = dateFormat && dateFormat.length > 0 ? dateFormat : "M/D/YYYY";
|
|
19
|
-
if (upper) {
|
|
20
|
-
format = format.toUpperCase();
|
|
21
|
-
}
|
|
22
|
-
var arr = [et, et, et];
|
|
23
|
-
var items = format.split(/\/|\.| |-/);
|
|
24
|
-
var iday = items.indexOf("D");
|
|
25
|
-
var im = items.indexOf("M");
|
|
26
|
-
var iyear = items.indexOf("YYYY");
|
|
27
|
-
var fm = full ? full : false;
|
|
28
|
-
var fd = full ? full : false;
|
|
29
|
-
var fy = true;
|
|
30
|
-
if (iday === -1) {
|
|
31
|
-
iday = items.indexOf("DD");
|
|
32
|
-
fd = true;
|
|
33
|
-
}
|
|
34
|
-
if (im === -1) {
|
|
35
|
-
im = items.indexOf("MM");
|
|
36
|
-
fm = true;
|
|
37
|
-
}
|
|
38
|
-
if (iyear === -1) {
|
|
39
|
-
iyear = items.indexOf("YY");
|
|
40
|
-
fy = full ? full : false;
|
|
14
|
+
function formatDate(d, format) {
|
|
15
|
+
if (!d || !format) {
|
|
16
|
+
return "";
|
|
41
17
|
}
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
var
|
|
46
|
-
var
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
18
|
+
var y = d.getFullYear();
|
|
19
|
+
var m = d.getMonth() + 1;
|
|
20
|
+
var day = d.getDate();
|
|
21
|
+
var out = "";
|
|
22
|
+
var i = 0;
|
|
23
|
+
while (i < format.length) {
|
|
24
|
+
var c = format.charCodeAt(i);
|
|
25
|
+
if (c === 121) {
|
|
26
|
+
var len = count(format, i, 121);
|
|
27
|
+
if (len >= 4) {
|
|
28
|
+
out += y.toString();
|
|
29
|
+
i += 4;
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
out += shortYear(y);
|
|
33
|
+
i += 2;
|
|
34
|
+
}
|
|
35
|
+
continue;
|
|
57
36
|
}
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
37
|
+
if (c === 77) {
|
|
38
|
+
var len = count(format, i, 77);
|
|
39
|
+
out += len >= 2 ? pad(m) : m.toString();
|
|
40
|
+
i += len >= 2 ? 2 : 1;
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
if (c === 100) {
|
|
44
|
+
var len = count(format, i, 100);
|
|
45
|
+
out += len >= 2 ? pad(day) : day.toString();
|
|
46
|
+
i += len >= 2 ? 2 : 1;
|
|
47
|
+
continue;
|
|
67
48
|
}
|
|
49
|
+
out += format[i];
|
|
50
|
+
i++;
|
|
68
51
|
}
|
|
69
|
-
return
|
|
52
|
+
return out;
|
|
70
53
|
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
return s.substring(s.length - 2);
|
|
54
|
+
exports.formatDate = formatDate;
|
|
55
|
+
function shortYear(y) {
|
|
56
|
+
return (y % 100 + 100) % 100 < 10
|
|
57
|
+
? "0" + ((y % 100 + 100) % 100)
|
|
58
|
+
: "" + ((y % 100 + 100) % 100);
|
|
77
59
|
}
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
60
|
+
function count(s, i, ch) {
|
|
61
|
+
var n = 0;
|
|
62
|
+
while (i + n < s.length && s.charCodeAt(i + n) === ch) {
|
|
63
|
+
n++;
|
|
64
|
+
}
|
|
65
|
+
return n;
|
|
81
66
|
}
|
|
82
67
|
function datetimeToString(date) {
|
|
83
68
|
if (!date || date === et) {
|
|
@@ -93,33 +78,33 @@ function datetimeToString(date) {
|
|
|
93
78
|
return year + "-" + month + "-" + day + "T" + hours + ":" + minutes + ":" + seconds;
|
|
94
79
|
}
|
|
95
80
|
exports.datetimeToString = datetimeToString;
|
|
96
|
-
function formatDateTime(date, dateFormat
|
|
81
|
+
function formatDateTime(date, dateFormat) {
|
|
97
82
|
if (!date) {
|
|
98
83
|
return et;
|
|
99
84
|
}
|
|
100
|
-
var sd = formatDate(date, dateFormat
|
|
85
|
+
var sd = formatDate(date, dateFormat);
|
|
101
86
|
if (sd.length === 0) {
|
|
102
87
|
return sd;
|
|
103
88
|
}
|
|
104
89
|
return sd + " " + formatTime(date);
|
|
105
90
|
}
|
|
106
91
|
exports.formatDateTime = formatDateTime;
|
|
107
|
-
function formatLongDateTime(date, dateFormat
|
|
92
|
+
function formatLongDateTime(date, dateFormat) {
|
|
108
93
|
if (!date) {
|
|
109
94
|
return et;
|
|
110
95
|
}
|
|
111
|
-
var sd = formatDate(date, dateFormat
|
|
96
|
+
var sd = formatDate(date, dateFormat);
|
|
112
97
|
if (sd.length === 0) {
|
|
113
98
|
return sd;
|
|
114
99
|
}
|
|
115
100
|
return sd + " " + formatLongTime(date);
|
|
116
101
|
}
|
|
117
102
|
exports.formatLongDateTime = formatLongDateTime;
|
|
118
|
-
function formatFullDateTime(date, dateFormat, s
|
|
103
|
+
function formatFullDateTime(date, dateFormat, s) {
|
|
119
104
|
if (!date) {
|
|
120
105
|
return et;
|
|
121
106
|
}
|
|
122
|
-
var sd = formatDate(date, dateFormat
|
|
107
|
+
var sd = formatDate(date, dateFormat);
|
|
123
108
|
if (sd.length === 0) {
|
|
124
109
|
return sd;
|
|
125
110
|
}
|
|
@@ -156,35 +141,88 @@ function pad3(n) {
|
|
|
156
141
|
}
|
|
157
142
|
return n < 10 ? "00" + n : "0" + n.toString();
|
|
158
143
|
}
|
|
159
|
-
function
|
|
160
|
-
if (
|
|
144
|
+
function formatInteger(v, groupSeparator) {
|
|
145
|
+
if (groupSeparator === void 0) { groupSeparator = ","; }
|
|
146
|
+
if (v == null || !Number.isFinite(v)) {
|
|
161
147
|
return "";
|
|
162
148
|
}
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
149
|
+
var isNegative = v < 0;
|
|
150
|
+
var n = Math.abs(Math.trunc(v));
|
|
151
|
+
if (n < 1000) {
|
|
152
|
+
return isNegative ? "-" + n : "" + n;
|
|
153
|
+
}
|
|
154
|
+
var buffer = new Array(32);
|
|
155
|
+
var i = buffer.length;
|
|
156
|
+
var digitCount = 0;
|
|
157
|
+
while (n > 0) {
|
|
158
|
+
if (digitCount > 0 && digitCount % 3 === 0) {
|
|
159
|
+
buffer[--i] = groupSeparator;
|
|
160
|
+
}
|
|
161
|
+
var digit = n % 10;
|
|
162
|
+
buffer[--i] = String.fromCharCode(48 + digit);
|
|
163
|
+
n = Math.floor(n / 10);
|
|
164
|
+
digitCount++;
|
|
165
|
+
}
|
|
166
|
+
if (isNegative) {
|
|
167
|
+
buffer[--i] = "-";
|
|
166
168
|
}
|
|
167
|
-
|
|
168
|
-
|
|
169
|
+
return buffer.slice(i).join("");
|
|
170
|
+
}
|
|
171
|
+
exports.formatInteger = formatInteger;
|
|
172
|
+
function formatNumber(v, precision, decimalSeparator, groupSeparator) {
|
|
173
|
+
if (precision === void 0) { precision = 0; }
|
|
174
|
+
if (v == null || !Number.isFinite(v)) {
|
|
175
|
+
return "";
|
|
169
176
|
}
|
|
170
|
-
var
|
|
171
|
-
var
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
177
|
+
var d = ".";
|
|
178
|
+
var g = ",";
|
|
179
|
+
if (decimalSeparator && groupSeparator) {
|
|
180
|
+
d = decimalSeparator;
|
|
181
|
+
g = groupSeparator;
|
|
182
|
+
}
|
|
183
|
+
else if (decimalSeparator && !groupSeparator) {
|
|
184
|
+
d = decimalSeparator;
|
|
185
|
+
if (d === "٫") {
|
|
186
|
+
g = "٬";
|
|
179
187
|
}
|
|
188
|
+
else {
|
|
189
|
+
g = d === "," ? "." : ",";
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
var negative = v < 0;
|
|
193
|
+
var s = Math.abs(v).toFixed(precision);
|
|
194
|
+
var dot = s.indexOf(".");
|
|
195
|
+
var intEnd = dot >= 0 ? dot : s.length;
|
|
196
|
+
var fracLen = dot >= 0 ? s.length - dot - 1 : 0;
|
|
197
|
+
var intLen = intEnd;
|
|
198
|
+
var groups = intLen > 3 ? ((intLen - 1) / 3) | 0 : 0;
|
|
199
|
+
var outLen = (negative ? 1 : 0) + intLen + groups * g.length + (fracLen > 0 ? d.length + fracLen : 0);
|
|
200
|
+
var out = new Array(outLen);
|
|
201
|
+
var p = 0;
|
|
202
|
+
if (negative) {
|
|
203
|
+
out[p++] = "-";
|
|
180
204
|
}
|
|
181
|
-
|
|
182
|
-
if (
|
|
183
|
-
|
|
205
|
+
var firstGroup = intLen % 3;
|
|
206
|
+
if (firstGroup === 0) {
|
|
207
|
+
firstGroup = 3;
|
|
184
208
|
}
|
|
185
|
-
|
|
186
|
-
|
|
209
|
+
for (var i = 0; i < intLen; i++) {
|
|
210
|
+
if (i > 0 && (i === firstGroup || (i > firstGroup && (i - firstGroup) % 3 === 0))) {
|
|
211
|
+
for (var j = 0; j < g.length; j++) {
|
|
212
|
+
out[p++] = g[j];
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
out[p++] = s[i];
|
|
216
|
+
}
|
|
217
|
+
if (fracLen > 0) {
|
|
218
|
+
for (var j = 0; j < d.length; j++) {
|
|
219
|
+
out[p++] = d[j];
|
|
220
|
+
}
|
|
221
|
+
for (var i = dot + 1; i < s.length; i++) {
|
|
222
|
+
out[p++] = s[i];
|
|
223
|
+
}
|
|
187
224
|
}
|
|
225
|
+
return out.join("");
|
|
188
226
|
}
|
|
189
227
|
exports.formatNumber = formatNumber;
|
|
190
228
|
var formatter = (function () {
|
package/package.json
CHANGED
package/src/index.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
const et = ""
|
|
2
2
|
|
|
3
3
|
export function getDateFormat(profile?: string): string {
|
|
4
|
-
return "M/
|
|
4
|
+
return "M/d/yyyy"
|
|
5
5
|
}
|
|
6
6
|
|
|
7
7
|
export function addDays(d: Date, n: number): Date {
|
|
@@ -9,71 +9,66 @@ export function addDays(d: Date, n: number): Date {
|
|
|
9
9
|
newDate.setDate(newDate.getDate() + n)
|
|
10
10
|
return newDate
|
|
11
11
|
}
|
|
12
|
-
export function formatDate(d: Date | null | undefined,
|
|
13
|
-
if (!d) {
|
|
14
|
-
return
|
|
15
|
-
}
|
|
16
|
-
let format = dateFormat && dateFormat.length > 0 ? dateFormat : "M/D/YYYY"
|
|
17
|
-
if (upper) {
|
|
18
|
-
format = format.toUpperCase()
|
|
19
|
-
}
|
|
20
|
-
let arr = [et, et, et]
|
|
21
|
-
const items = format.split(/\/|\.| |-/)
|
|
22
|
-
let iday = items.indexOf("D")
|
|
23
|
-
let im = items.indexOf("M")
|
|
24
|
-
let iyear = items.indexOf("YYYY")
|
|
25
|
-
let fm = full ? full : false
|
|
26
|
-
let fd = full ? full : false
|
|
27
|
-
let fy = true
|
|
28
|
-
if (iday === -1) {
|
|
29
|
-
iday = items.indexOf("DD")
|
|
30
|
-
fd = true
|
|
31
|
-
}
|
|
32
|
-
if (im === -1) {
|
|
33
|
-
im = items.indexOf("MM")
|
|
34
|
-
fm = true
|
|
35
|
-
}
|
|
36
|
-
if (iyear === -1) {
|
|
37
|
-
iyear = items.indexOf("YY")
|
|
38
|
-
fy = full ? full : false
|
|
12
|
+
export function formatDate(d: Date | null | undefined, format?: string): any {
|
|
13
|
+
if (!d || !format) {
|
|
14
|
+
return ""
|
|
39
15
|
}
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
16
|
+
const y = d.getFullYear()
|
|
17
|
+
const m = d.getMonth() + 1
|
|
18
|
+
const day = d.getDate()
|
|
19
|
+
|
|
20
|
+
let out = ""
|
|
21
|
+
let i = 0
|
|
22
|
+
|
|
23
|
+
while (i < format.length) {
|
|
24
|
+
const c = format.charCodeAt(i)
|
|
25
|
+
|
|
26
|
+
// yyyy / yy
|
|
27
|
+
if (c === 121 /* y */) {
|
|
28
|
+
const len = count(format, i, 121)
|
|
29
|
+
if (len >= 4) {
|
|
30
|
+
out += y.toString()
|
|
31
|
+
i += 4
|
|
32
|
+
} else {
|
|
33
|
+
out += shortYear(y)
|
|
34
|
+
i += 2
|
|
35
|
+
}
|
|
36
|
+
continue
|
|
54
37
|
}
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
if (!((c >= "A" && c <= "Z") || (c >= "a" && c <= "z"))) {
|
|
63
|
-
return c
|
|
38
|
+
|
|
39
|
+
// MM / M
|
|
40
|
+
if (c === 77 /* M */) {
|
|
41
|
+
const len = count(format, i, 77)
|
|
42
|
+
out += len >= 2 ? pad(m) : m.toString()
|
|
43
|
+
i += len >= 2 ? 2 : 1
|
|
44
|
+
continue
|
|
64
45
|
}
|
|
46
|
+
|
|
47
|
+
// dd / d
|
|
48
|
+
if (c === 100 /* d */) {
|
|
49
|
+
const len = count(format, i, 100)
|
|
50
|
+
out += len >= 2 ? pad(day) : day.toString()
|
|
51
|
+
i += len >= 2 ? 2 : 1
|
|
52
|
+
continue
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// literal char
|
|
56
|
+
out += format[i]
|
|
57
|
+
i++
|
|
65
58
|
}
|
|
66
|
-
return
|
|
59
|
+
return out
|
|
67
60
|
}
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
const s = y.toString()
|
|
73
|
-
return s.substring(s.length - 2)
|
|
61
|
+
function shortYear(y: number): string {
|
|
62
|
+
return (y % 100 + 100) % 100 < 10
|
|
63
|
+
? "0" + ((y % 100 + 100) % 100)
|
|
64
|
+
: "" + ((y % 100 + 100) % 100)
|
|
74
65
|
}
|
|
75
|
-
function
|
|
76
|
-
|
|
66
|
+
function count(s: string, i: number, ch: number): number {
|
|
67
|
+
let n = 0
|
|
68
|
+
while (i + n < s.length && s.charCodeAt(i + n) === ch) {
|
|
69
|
+
n++
|
|
70
|
+
}
|
|
71
|
+
return n
|
|
77
72
|
}
|
|
78
73
|
export function datetimeToString(date?: Date | string): any {
|
|
79
74
|
if (!date || date === et) {
|
|
@@ -88,31 +83,31 @@ export function datetimeToString(date?: Date | string): any {
|
|
|
88
83
|
const seconds = pad(d2.getSeconds())
|
|
89
84
|
return `${year}-${month}-${day}T${hours}:${minutes}:${seconds}`
|
|
90
85
|
}
|
|
91
|
-
export function formatDateTime(date: Date | null | undefined, dateFormat?: string
|
|
86
|
+
export function formatDateTime(date: Date | null | undefined, dateFormat?: string): any {
|
|
92
87
|
if (!date) {
|
|
93
88
|
return et
|
|
94
89
|
}
|
|
95
|
-
const sd = formatDate(date, dateFormat
|
|
90
|
+
const sd = formatDate(date, dateFormat)
|
|
96
91
|
if (sd.length === 0) {
|
|
97
92
|
return sd
|
|
98
93
|
}
|
|
99
94
|
return sd + " " + formatTime(date)
|
|
100
95
|
}
|
|
101
|
-
export function formatLongDateTime(date: Date | null | undefined, dateFormat?: string
|
|
96
|
+
export function formatLongDateTime(date: Date | null | undefined, dateFormat?: string): any {
|
|
102
97
|
if (!date) {
|
|
103
98
|
return et
|
|
104
99
|
}
|
|
105
|
-
const sd = formatDate(date, dateFormat
|
|
100
|
+
const sd = formatDate(date, dateFormat)
|
|
106
101
|
if (sd.length === 0) {
|
|
107
102
|
return sd
|
|
108
103
|
}
|
|
109
104
|
return sd + " " + formatLongTime(date)
|
|
110
105
|
}
|
|
111
|
-
export function formatFullDateTime(date: Date | null | undefined, dateFormat?: string, s?: string
|
|
106
|
+
export function formatFullDateTime(date: Date | null | undefined, dateFormat?: string, s?: string): any {
|
|
112
107
|
if (!date) {
|
|
113
108
|
return et
|
|
114
109
|
}
|
|
115
|
-
const sd = formatDate(date, dateFormat
|
|
110
|
+
const sd = formatDate(date, dateFormat)
|
|
116
111
|
if (sd.length === 0) {
|
|
117
112
|
return sd
|
|
118
113
|
}
|
|
@@ -145,33 +140,114 @@ function pad3(n: number): string {
|
|
|
145
140
|
return n < 10 ? "00" + n : "0" + n.toString()
|
|
146
141
|
}
|
|
147
142
|
|
|
148
|
-
export function
|
|
149
|
-
if (v == null) {
|
|
143
|
+
export function formatInteger(v: number | null | undefined, groupSeparator: string = ","): any {
|
|
144
|
+
if (v == null || !Number.isFinite(v)) {
|
|
150
145
|
return ""
|
|
151
146
|
}
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
147
|
+
|
|
148
|
+
const isNegative = v < 0
|
|
149
|
+
let n = Math.abs(Math.trunc(v))
|
|
150
|
+
|
|
151
|
+
// Fast path
|
|
152
|
+
if (n < 1000) {
|
|
153
|
+
return isNegative ? `-${n}` : `${n}`
|
|
157
154
|
}
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
const
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
155
|
+
|
|
156
|
+
// Max length:
|
|
157
|
+
// digits (up to 16 for JS safe int) + separators (~5) + sign
|
|
158
|
+
const buffer = new Array(32)
|
|
159
|
+
let i = buffer.length
|
|
160
|
+
|
|
161
|
+
let digitCount = 0
|
|
162
|
+
|
|
163
|
+
while (n > 0) {
|
|
164
|
+
// Insert separator every 3 digits
|
|
165
|
+
if (digitCount > 0 && digitCount % 3 === 0) {
|
|
166
|
+
buffer[--i] = groupSeparator
|
|
167
167
|
}
|
|
168
|
+
|
|
169
|
+
const digit = n % 10
|
|
170
|
+
buffer[--i] = String.fromCharCode(48 + digit)
|
|
171
|
+
|
|
172
|
+
n = Math.floor(n / 10) // safe version
|
|
173
|
+
digitCount++
|
|
168
174
|
}
|
|
169
|
-
|
|
170
|
-
if (
|
|
171
|
-
|
|
172
|
-
} else {
|
|
173
|
-
return arr.reverse().join("") + d + x[1]
|
|
175
|
+
|
|
176
|
+
if (isNegative) {
|
|
177
|
+
buffer[--i] = "-"
|
|
174
178
|
}
|
|
179
|
+
|
|
180
|
+
// Slice only used portion and join once
|
|
181
|
+
return buffer.slice(i).join("")
|
|
182
|
+
}
|
|
183
|
+
export function formatNumber(v?: number | null, precision = 0, decimalSeparator?: string | null, groupSeparator?: string | null): any {
|
|
184
|
+
if (v == null || !Number.isFinite(v)) {
|
|
185
|
+
return ""
|
|
186
|
+
}
|
|
187
|
+
let d = "."
|
|
188
|
+
let g = ","
|
|
189
|
+
if (decimalSeparator && groupSeparator) {
|
|
190
|
+
d = decimalSeparator
|
|
191
|
+
g = groupSeparator
|
|
192
|
+
} else if (decimalSeparator && !groupSeparator) {
|
|
193
|
+
d = decimalSeparator
|
|
194
|
+
if (d === "٫") {
|
|
195
|
+
g = "٬"
|
|
196
|
+
} else {
|
|
197
|
+
g = d === "," ? "." : ","
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
const negative = v < 0
|
|
201
|
+
|
|
202
|
+
// unavoidable allocation
|
|
203
|
+
const s = Math.abs(v).toFixed(precision)
|
|
204
|
+
|
|
205
|
+
const dot = s.indexOf(".")
|
|
206
|
+
|
|
207
|
+
const intEnd = dot >= 0 ? dot : s.length
|
|
208
|
+
const fracLen = dot >= 0 ? s.length - dot - 1 : 0
|
|
209
|
+
|
|
210
|
+
const intLen = intEnd
|
|
211
|
+
const groups = intLen > 3 ? ((intLen - 1) / 3) | 0 : 0
|
|
212
|
+
|
|
213
|
+
const outLen = (negative ? 1 : 0) + intLen + groups * g.length + (fracLen > 0 ? d.length + fracLen : 0)
|
|
214
|
+
|
|
215
|
+
const out = new Array<string>(outLen)
|
|
216
|
+
|
|
217
|
+
let p = 0
|
|
218
|
+
|
|
219
|
+
if (negative) {
|
|
220
|
+
out[p++] = "-"
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
// integer part
|
|
224
|
+
let firstGroup = intLen % 3
|
|
225
|
+
if (firstGroup === 0) {
|
|
226
|
+
firstGroup = 3
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
for (let i = 0; i < intLen; i++) {
|
|
230
|
+
if (i > 0 && (i === firstGroup || (i > firstGroup && (i - firstGroup) % 3 === 0))) {
|
|
231
|
+
for (let j = 0; j < g.length; j++) {
|
|
232
|
+
out[p++] = g[j]
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
out[p++] = s[i]
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
// fractional part
|
|
240
|
+
if (fracLen > 0) {
|
|
241
|
+
for (let j = 0; j < d.length; j++) {
|
|
242
|
+
out[p++] = d[j]
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
for (let i = dot + 1; i < s.length; i++) {
|
|
246
|
+
out[p++] = s[i]
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
return out.join("")
|
|
175
251
|
}
|
|
176
252
|
|
|
177
253
|
// tslint:disable-next-line:class-name
|