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.
Files changed (3) hide show
  1. package/lib/index.js +127 -89
  2. package/package.json +1 -1
  3. 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/D/YYYY";
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, dateFormat, full, upper) {
15
- if (!d) {
16
- return et;
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
- arr[iday] = getD(d.getDate(), fd);
43
- arr[im] = getD(d.getMonth() + 1, fm);
44
- arr[iyear] = getYear(d.getFullYear(), fy);
45
- var s = detectSeparator(format);
46
- var e = detectLastSeparator(format);
47
- var l = items.length === 4 ? format[format.length - 1] : et;
48
- return arr[0] + s + arr[1] + e + arr[2] + l;
49
- }
50
- exports.formatDate = formatDate;
51
- function detectSeparator(format) {
52
- var len = format.length;
53
- for (var i = 0; i < len; i++) {
54
- var c = format[i];
55
- if (!((c >= "A" && c <= "Z") || (c >= "a" && c <= "z"))) {
56
- return c;
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
- return "/";
60
- }
61
- function detectLastSeparator(format) {
62
- var len = format.length - 3;
63
- for (var i = len; i > -0; i--) {
64
- var c = format[i];
65
- if (!((c >= "A" && c <= "Z") || (c >= "a" && c <= "z"))) {
66
- return c;
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
- function getYear(y, full) {
72
- if (full || (y <= 99 && y >= -99)) {
73
- return y.toString();
74
- }
75
- var s = y.toString();
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
- exports.getYear = getYear;
79
- function getD(n, fu) {
80
- return fu ? pad(n) : n.toString();
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, full, upper) {
81
+ function formatDateTime(date, dateFormat) {
97
82
  if (!date) {
98
83
  return et;
99
84
  }
100
- var sd = formatDate(date, dateFormat, full, upper);
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, full, upper) {
92
+ function formatLongDateTime(date, dateFormat) {
108
93
  if (!date) {
109
94
  return et;
110
95
  }
111
- var sd = formatDate(date, dateFormat, full, upper);
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, full, upper) {
103
+ function formatFullDateTime(date, dateFormat, s) {
119
104
  if (!date) {
120
105
  return et;
121
106
  }
122
- var sd = formatDate(date, dateFormat, full, upper);
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 formatNumber(v, scale, d, g) {
160
- if (v == null) {
144
+ function formatInteger(v, groupSeparator) {
145
+ if (groupSeparator === void 0) { groupSeparator = ","; }
146
+ if (v == null || !Number.isFinite(v)) {
161
147
  return "";
162
148
  }
163
- if (!d && !g) {
164
- g = ",";
165
- d = ".";
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
- else if (!g) {
168
- g = d === "," ? "." : ",";
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 s = scale === 0 || scale ? v.toFixed(scale) : v.toString();
171
- var x = s.split(".", 2);
172
- var y = x[0];
173
- var arr = [];
174
- var len = y.length - 1;
175
- for (var k = 0; k < len; k++) {
176
- arr.push(y[len - k]);
177
- if ((k + 1) % 3 === 0) {
178
- arr.push(g);
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
- arr.push(y[0]);
182
- if (x.length === 1) {
183
- return arr.reverse().join("");
205
+ var firstGroup = intLen % 3;
206
+ if (firstGroup === 0) {
207
+ firstGroup = 3;
184
208
  }
185
- else {
186
- return arr.reverse().join("") + d + x[1];
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ui-formatter",
3
- "version": "0.0.8",
3
+ "version": "0.1.1",
4
4
  "description": "Format web UI",
5
5
  "main": "./lib/index.js",
6
6
  "types": "./src/index.ts",
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/D/YYYY"
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, dateFormat?: string, full?: boolean, upper?: boolean): string {
13
- if (!d) {
14
- return et
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
- arr[iday] = getD(d.getDate(), fd)
41
- arr[im] = getD(d.getMonth() + 1, fm)
42
- arr[iyear] = getYear(d.getFullYear(), fy)
43
- const s = detectSeparator(format)
44
- const e = detectLastSeparator(format)
45
- const l = items.length === 4 ? format[format.length - 1] : et
46
- return arr[0] + s + arr[1] + e + arr[2] + l
47
- }
48
- function detectSeparator(format: string): string {
49
- const len = format.length
50
- for (let i = 0; i < len; i++) {
51
- const c = format[i]
52
- if (!((c >= "A" && c <= "Z") || (c >= "a" && c <= "z"))) {
53
- return c
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
- return "/"
57
- }
58
- function detectLastSeparator(format: string): string {
59
- const len = format.length - 3
60
- for (let i = len; i > -0; i--) {
61
- const c = format[i]
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
- export function getYear(y: number, full?: boolean): string {
69
- if (full || (y <= 99 && y >= -99)) {
70
- return y.toString()
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 getD(n: number, fu: boolean): string {
76
- return fu ? pad(n) : n.toString()
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, full?: boolean, upper?: boolean): any {
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, full, upper)
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, full?: boolean, upper?: boolean): any {
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, full, upper)
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, full?: boolean, upper?: boolean): any {
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, full, upper)
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 formatNumber(v?: number | null, scale?: number, d?: string | null, g?: string): any {
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
- if (!d && !g) {
153
- g = ","
154
- d = "."
155
- } else if (!g) {
156
- g = d === "," ? "." : ","
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
- const s = scale === 0 || scale ? v.toFixed(scale) : v.toString()
159
- const x = s.split(".", 2)
160
- const y = x[0]
161
- const arr: string[] = []
162
- const len = y.length - 1
163
- for (let k = 0; k < len; k++) {
164
- arr.push(y[len - k])
165
- if ((k + 1) % 3 === 0) {
166
- arr.push(g)
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
- arr.push(y[0])
170
- if (x.length === 1) {
171
- return arr.reverse().join("")
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