diff --git a/src/js/internal/util/inspect.js b/src/js/internal/util/inspect.js index 2a86431c76..d60d600f3a 100644 --- a/src/js/internal/util/inspect.js +++ b/src/js/internal/util/inspect.js @@ -1967,16 +1967,22 @@ function formatNumber(fn, number, numericSeparator) { return fn(`${number}`, "number"); } const integer = MathTrunc(number); - const string = String(integer); + // Handle -0 specially to preserve the negative sign + const string = ObjectIs(integer, -0) ? "-0" : String(integer); if (integer === number) { - if (!NumberIsFinite(number) || StringPrototypeIncludes(string, "e")) { - return fn(string, "number"); + // Check the original number string for scientific notation, not the integer string + if (!NumberIsFinite(number) || StringPrototypeIncludes(String(number), "e")) { + return fn(`${number}`, "number"); } return fn(`${addNumericSeparator(string)}`, "number"); } if (NumberIsNaN(number)) { return fn(string, "number"); } + // Check the original number string for scientific notation before applying separators + if (StringPrototypeIncludes(String(number), "e")) { + return fn(`${number}`, "number"); + } return fn( `${addNumericSeparator(string)}.${addNumericSeparatorEnd(StringPrototypeSlice(String(number), string.length + 1))}`, "number", diff --git a/test/regression/issue/23098.test.ts b/test/regression/issue/23098.test.ts new file mode 100644 index 0000000000..07a15eddef --- /dev/null +++ b/test/regression/issue/23098.test.ts @@ -0,0 +1,28 @@ +import { test, expect } from "bun:test"; +import { inspect } from "node:util"; + +test("util.inspect formats negative fractional numbers correctly with numericSeparator: true (#23098)", () => { + // Test the specific cases from the issue + const values = [0.1234, -0.12, -0.123, -0.1234, -1.234]; + const text = inspect(values, { numericSeparator: true }); + expect(text).toBe("[ 0.123_4, -0.12, -0.123, -0.123_4, -1.234 ]"); + + // Test individual values + expect(inspect(-0.12, { numericSeparator: true })).toBe("-0.12"); + expect(inspect(-0.123, { numericSeparator: true })).toBe("-0.123"); + expect(inspect(-0.1234, { numericSeparator: true })).toBe("-0.123_4"); + expect(inspect(-0.123456789, { numericSeparator: true })).toBe("-0.123_456_789"); + + // Test edge cases + expect(inspect(-0, { numericSeparator: true })).toBe("-0"); + expect(inspect(0, { numericSeparator: true })).toBe("0"); + + // Test scientific notation doesn't get separators + expect(inspect(1.23e-10, { numericSeparator: true })).toBe("1.23e-10"); + expect(inspect(-1.23e-10, { numericSeparator: true })).toBe("-1.23e-10"); + expect(inspect(1.23e10, { numericSeparator: true })).toBe("12_300_000_000"); + expect(inspect(-1.23e10, { numericSeparator: true })).toBe("-12_300_000_000"); + + // Test large negative numbers still work + expect(inspect(-123456789.123456789, { numericSeparator: true })).toBe("-123_456_789.123_456_79"); +}); \ No newline at end of file