number-as-string
Version:
Precise number scaling and formatting without JavaScript floating-point precision issues
85 lines (84 loc) • 6.11 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const index_1 = require("../src/index");
describe("trimWithPrecision", () => {
test("should trim regular floating-point numbers", () => {
expect((0, index_1.trimWithPrecision)("0.1", 2)).toBe("0.1");
expect((0, index_1.trimWithPrecision)("-0.1", 2)).toBe("-0.1");
expect((0, index_1.trimWithPrecision)("3.14159", 3)).toBe("3.141");
expect((0, index_1.trimWithPrecision)("-3.14159", 4)).toBe("-3.1415");
expect((0, index_1.trimWithPrecision)("1234567890.987654321", 6)).toBe("1234567890.987654");
expect((0, index_1.trimWithPrecision)("-9876543210.123456789", 5)).toBe("-9876543210.12345");
expect((0, index_1.trimWithPrecision)("0.2161", 18)).toBe("0.2161");
expect((0, index_1.trimWithPrecision)("1", 18)).toBe("1");
expect((0, index_1.trimWithPrecision)(0.1, 2)).toBe("0.1");
expect((0, index_1.trimWithPrecision)(-0.1, 2)).toBe("-0.1");
expect((0, index_1.trimWithPrecision)(3.14159, 3)).toBe("3.141");
expect((0, index_1.trimWithPrecision)(-3.14159, 4)).toBe("-3.1415");
expect((0, index_1.trimWithPrecision)(1234567890.987654321, 6)).toBe("1234567890.987654");
expect((0, index_1.trimWithPrecision)(-9876543210.123456789, 5)).toBe("-9876543210.12345");
expect((0, index_1.trimWithPrecision)(0.2161, 18)).toBe("0.2161");
expect((0, index_1.trimWithPrecision)(1, 18)).toBe("1");
});
test("should trim scientific notation numbers", () => {
expect((0, index_1.trimWithPrecision)("1e3", 0)).toBe("1000");
expect((0, index_1.trimWithPrecision)("1e18", 0)).toBe("1" + "0".repeat(18));
expect((0, index_1.trimWithPrecision)("1E3", 1)).toBe("1000");
expect((0, index_1.trimWithPrecision)("-1e3", 2)).toBe("-1000");
expect((0, index_1.trimWithPrecision)("1.23e4", 2)).toBe("12300");
expect((0, index_1.trimWithPrecision)("-1.23E4", 3)).toBe("-12300");
expect((0, index_1.trimWithPrecision)("1.2e-3", 5)).toBe("0.0012");
expect((0, index_1.trimWithPrecision)("-1.2E-3", 4)).toBe("-0.0012");
expect((0, index_1.trimWithPrecision)("1e0", 2)).toBe("1");
expect((0, index_1.trimWithPrecision)("1.2e0", 3)).toBe("1.2");
expect((0, index_1.trimWithPrecision)("1e-18", 20)).toBe("0.000000000000000001");
expect((0, index_1.trimWithPrecision)("-1e-18", 19)).toBe("-0.000000000000000001");
expect((0, index_1.trimWithPrecision)("1868.564646E2", 3)).toBe("186856.464");
expect((0, index_1.trimWithPrecision)("1.7976931348623157e+308", 308)).toBe("17976931348623157" + "0".repeat(292));
expect((0, index_1.trimWithPrecision)("5e-1", 10)).toBe("0.5");
expect((0, index_1.trimWithPrecision)("5e-324", 324)).toBe("0." + "5".padStart(324, "0")); // Underflow case
expect((0, index_1.trimWithPrecision)(1e3, 0)).toBe("1000");
expect((0, index_1.trimWithPrecision)(1e18, 0)).toBe("1" + "0".repeat(18));
expect((0, index_1.trimWithPrecision)(1e3, 1)).toBe("1000");
expect((0, index_1.trimWithPrecision)(-1e3, 2)).toBe("-1000");
expect((0, index_1.trimWithPrecision)(1.23e4, 2)).toBe("12300");
expect((0, index_1.trimWithPrecision)(-1.23e4, 3)).toBe("-12300");
expect((0, index_1.trimWithPrecision)(1.2e-3, 5)).toBe("0.0012");
expect((0, index_1.trimWithPrecision)(-1.2e-3, 4)).toBe("-0.0012");
expect((0, index_1.trimWithPrecision)(-1.2465667e-3, 5)).toBe("-0.00124");
expect((0, index_1.trimWithPrecision)(1, 2)).toBe("1");
expect((0, index_1.trimWithPrecision)(1.2, 3)).toBe("1.2");
expect((0, index_1.trimWithPrecision)(1e-18, 20)).toBe("0.000000000000000001");
expect((0, index_1.trimWithPrecision)(-1e-18, 19)).toBe("-0.000000000000000001");
expect((0, index_1.trimWithPrecision)(1868.564646e2, 3)).toBe("186856.464");
expect((0, index_1.trimWithPrecision)(1.7976931348623157e308, 309)).toBe("17976931348623157" + "0".repeat(292));
expect((0, index_1.trimWithPrecision)(5e-1, 10)).toBe("0.5");
expect((0, index_1.trimWithPrecision)(5e-324, 324)).toBe("0." + "5".padStart(324, "0"));
});
test("should handle Infinity & NaN", () => {
expect((0, index_1.trimWithPrecision)("Infinity", 2)).toBe("Infinity");
expect((0, index_1.trimWithPrecision)("-Infinity", 3)).toBe("-Infinity");
expect(() => (0, index_1.trimWithPrecision)("NaN", 2)).toThrow("Invalid number input");
});
test("should handle whole numbers", () => {
expect((0, index_1.trimWithPrecision)("42", 2)).toBe("42");
expect((0, index_1.trimWithPrecision)("-42", 1)).toBe("-42");
expect((0, index_1.trimWithPrecision)("999999999999999999999", 5)).toBe("999999999999999999999");
});
test("should handle numbers with leading/trailing spaces", () => {
expect((0, index_1.trimWithPrecision)(" 42", 2)).toBe("42");
expect((0, index_1.trimWithPrecision)("42 ", 2)).toBe("42");
expect((0, index_1.trimWithPrecision)(" 0.5 ", 1)).toBe("0.5");
expect((0, index_1.trimWithPrecision)("000123", 2)).toBe("123");
expect((0, index_1.trimWithPrecision)("-0000123.4500", 3)).toBe("-123.45");
});
test("should handle BigInt-like string numbers", () => {
expect((0, index_1.trimWithPrecision)("123456789012345678901234567890", 10)).toBe("123456789012345678901234567890");
expect((0, index_1.trimWithPrecision)("999999999999999999999999999999999999999999999999999999", 5)).toBe("999999999999999999999999999999999999999999999999999999");
expect((0, index_1.trimWithPrecision)("-987654321098765432109876543210", 3)).toBe("-987654321098765432109876543210");
});
test("should validate decimals parameter", () => {
expect(() => (0, index_1.trimWithPrecision)("1.23", -1)).toThrow("Decimals must be a non-negative integer");
expect(() => (0, index_1.trimWithPrecision)("1.23", 2.5)).toThrow("Decimals must be a non-negative integer");
});
});