ui-formatter 0.1.0 → 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 +74 -21
  2. package/package.json +1 -1
  3. package/src/index.ts +102 -21
package/lib/index.js CHANGED
@@ -141,35 +141,88 @@ function pad3(n) {
141
141
  }
142
142
  return n < 10 ? "00" + n : "0" + n.toString();
143
143
  }
144
- function formatNumber(v, scale, d, g) {
145
- if (v == null) {
144
+ function formatInteger(v, groupSeparator) {
145
+ if (groupSeparator === void 0) { groupSeparator = ","; }
146
+ if (v == null || !Number.isFinite(v)) {
146
147
  return "";
147
148
  }
148
- if (!d && !g) {
149
- g = ",";
150
- d = ".";
149
+ var isNegative = v < 0;
150
+ var n = Math.abs(Math.trunc(v));
151
+ if (n < 1000) {
152
+ return isNegative ? "-" + n : "" + n;
151
153
  }
152
- else if (!g) {
153
- g = d === "," ? "." : ",";
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] = "-";
154
168
  }
155
- var s = scale === 0 || scale ? v.toFixed(scale) : v.toString();
156
- var x = s.split(".", 2);
157
- var y = x[0];
158
- var arr = [];
159
- var len = y.length - 1;
160
- for (var k = 0; k < len; k++) {
161
- arr.push(y[len - k]);
162
- if ((k + 1) % 3 === 0) {
163
- arr.push(g);
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 "";
176
+ }
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 = "٬";
187
+ }
188
+ else {
189
+ g = d === "," ? "." : ",";
164
190
  }
165
191
  }
166
- arr.push(y[0]);
167
- if (x.length === 1) {
168
- return arr.reverse().join("");
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++] = "-";
204
+ }
205
+ var firstGroup = intLen % 3;
206
+ if (firstGroup === 0) {
207
+ firstGroup = 3;
169
208
  }
170
- else {
171
- 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
+ }
172
224
  }
225
+ return out.join("");
173
226
  }
174
227
  exports.formatNumber = formatNumber;
175
228
  var formatter = (function () {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ui-formatter",
3
- "version": "0.1.0",
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
@@ -140,33 +140,114 @@ function pad3(n: number): string {
140
140
  return n < 10 ? "00" + n : "0" + n.toString()
141
141
  }
142
142
 
143
- export function formatNumber(v?: number | null, scale?: number, d?: string | null, g?: string): any {
144
- if (v == null) {
143
+ export function formatInteger(v: number | null | undefined, groupSeparator: string = ","): any {
144
+ if (v == null || !Number.isFinite(v)) {
145
145
  return ""
146
146
  }
147
- if (!d && !g) {
148
- g = ","
149
- d = "."
150
- } else if (!g) {
151
- 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}`
152
154
  }
153
- const s = scale === 0 || scale ? v.toFixed(scale) : v.toString()
154
- const x = s.split(".", 2)
155
- const y = x[0]
156
- const arr: string[] = []
157
- const len = y.length - 1
158
- for (let k = 0; k < len; k++) {
159
- arr.push(y[len - k])
160
- if ((k + 1) % 3 === 0) {
161
- 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
162
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++
163
174
  }
164
- arr.push(y[0])
165
- if (x.length === 1) {
166
- return arr.reverse().join("")
167
- } else {
168
- return arr.reverse().join("") + d + x[1]
175
+
176
+ if (isNegative) {
177
+ buffer[--i] = "-"
169
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("")
170
251
  }
171
252
 
172
253
  // tslint:disable-next-line:class-name