diff --git a/dist/js/shared/str.d.ts b/dist/js/shared/str.d.ts index 9cd8aec..1c52214 100644 --- a/dist/js/shared/str.d.ts +++ b/dist/js/shared/str.d.ts @@ -54,3 +54,6 @@ export function renderTemplateStringWithEval(template: string, context: Object): * */ export function createSafeFilename(name: string): string; +export function numberPad(num: any, prec?: number, length?: number): any; +export function numberPadArray(array: any, prec?: number, length?: number): any; +export function numberFormat(n: any, precision?: number): any; diff --git a/dist/js/shared/str.js b/dist/js/shared/str.js index b4c870d..f2075a6 100644 --- a/dist/js/shared/str.js +++ b/dist/js/shared/str.js @@ -3,11 +3,12 @@ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); -exports.createSafeFilename = exports.renderTemplateStringWithEval = exports.renderTemplateString = exports.findPreviousVersion = exports.convertArabicToRoman = exports.removeEmptyLinesFromString = exports.removeCommentsFromSourceCode = exports.toFixedLocale = exports.randomAlphanumeric = exports.removeNewLinesAndExtraSpaces = void 0; +exports.numberFormat = exports.numberPadArray = exports.numberPad = exports.createSafeFilename = exports.renderTemplateStringWithEval = exports.renderTemplateString = exports.findPreviousVersion = exports.convertArabicToRoman = exports.removeEmptyLinesFromString = exports.removeCommentsFromSourceCode = exports.toFixedLocale = exports.randomAlphanumeric = exports.removeNewLinesAndExtraSpaces = void 0; const coerce_1 = __importDefault(require("semver/functions/coerce")); const lt_1 = __importDefault(require("semver/functions/lt")); const rcompare_1 = __importDefault(require("semver/functions/rcompare")); const underscore_1 = __importDefault(require("underscore")); +const underscore_string_1 = __importDefault(require("underscore.string")); function removeNewLinesAndExtraSpaces(str) { return str.replace(/[\n\r]/g, "").replace(/ +/g, " "); } @@ -146,3 +147,18 @@ function createSafeFilename(name) { .replace(/^_+|_+$/g, ""); } exports.createSafeFilename = createSafeFilename; +function numberPad(num, prec = 8, length = 16) { + return underscore_string_1.default.lpad(num.toFixed(prec), length, " "); +} +exports.numberPad = numberPad; +function numberPadArray(array, prec = 4, length = 9) { + return array.map((x) => numberPad(x, prec, length)).join(" "); +} +exports.numberPadArray = numberPadArray; +function numberFormat(n, precision = 3) { + if (precision === 0) { + return Math.ceil(n).toString(); + } + return underscore_string_1.default.numberFormat(n, precision); +} +exports.numberFormat = numberFormat; diff --git a/src/js/shared/str.js b/src/js/shared/str.js index 18df796..ab8c707 100644 --- a/src/js/shared/str.js +++ b/src/js/shared/str.js @@ -2,6 +2,7 @@ import semverCoerce from "semver/functions/coerce"; import semverLt from "semver/functions/lt"; import semverRcompare from "semver/functions/rcompare"; import _ from "underscore"; +import s from "underscore.string"; export function removeNewLinesAndExtraSpaces(str) { return str.replace(/[\n\r]/g, "").replace(/ +/g, " "); @@ -144,3 +145,18 @@ export function createSafeFilename(name) { .replace(/[^a-z0-9]+/g, "_") .replace(/^_+|_+$/g, ""); } + +export function numberPad(num, prec = 8, length = 16) { + return s.lpad(num.toFixed(prec), length, " "); +} + +export function numberPadArray(array, prec = 4, length = 9) { + return array.map((x) => numberPad(x, prec, length)).join(" "); +} + +export function numberFormat(n, precision = 3) { + if (precision === 0) { + return Math.ceil(n).toString(); + } + return s.numberFormat(n, precision); +} diff --git a/tests/js/str.tests.ts b/tests/js/str.tests.ts index f6fff18..7330af0 100644 --- a/tests/js/str.tests.ts +++ b/tests/js/str.tests.ts @@ -3,6 +3,9 @@ import { expect } from "chai"; import { createSafeFilename, findPreviousVersion, + numberFormat, + numberPad, + numberPadArray, renderTemplateString, renderTemplateStringWithEval, } from "../../src/js/shared/str"; @@ -81,3 +84,29 @@ describe("createSafeFilename", () => { expect(createSafeFilename("---spaces and dashes---")).to.equal("spaces_and_dashes"); }); }); + +describe("numberPad", () => { + it("should pad number with spaces to specified length", () => { + expect(numberPad(3.14, 2, 10).trim()).to.equal("3.14"); + expect(numberPad(42, 4, 12).trim()).to.equal("42.0000"); + expect(numberPad(123.456, 2, 15).length).to.equal(15); + }); +}); + +describe("numberPadArray", () => { + it("should pad array of numbers and join with spaces", () => { + const result = numberPadArray([1, 2.5, 3.14]); + expect(result).to.be.a("string"); + expect(result).to.include("1.0000"); + expect(result).to.include("2.5000"); + expect(result).to.include("3.1400"); + }); +}); + +describe("numberFormat", () => { + it("should format numbers with specified precision", () => { + expect(numberFormat(1234.567, 2)).to.match(/^[\d,]+\.\d{1,2}$/); + expect(numberFormat(1000, 0)).to.equal("1000"); + expect(numberFormat(3.1, 0)).to.equal("4"); + }); +});