Skip to content

Commit bf7a72b

Browse files
feat: add support for negative zeros
1 parent f20ff2d commit bf7a72b

File tree

3 files changed

+31
-5
lines changed

3 files changed

+31
-5
lines changed

src/numbers/custom-number-format.js

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ function roundNumber(formatOptions) {
8787
number = round(number);
8888
}
8989

90-
if (formatOptions.negative && (number * -1) >= 0) {
90+
if (formatOptions.negative && (number * -1) >= 0 && !formatOptions.negativeZero) {
9191
formatOptions.negative = false;
9292
}
9393

@@ -102,7 +102,7 @@ function isConstantFormat(format) {
102102
function setValueSpecificFormat(formatOptions) {
103103
let { number, format } = formatOptions;
104104
format = format.split(LIST_SEPARATOR);
105-
if (formatOptions.negative && format[1]) {
105+
if ((formatOptions.negative || formatOptions.negativeZero) && format[1]) {
106106
format = format[1];
107107
formatOptions.hasNegativeFormat = true;
108108
} else if (number === 0) {
@@ -198,7 +198,7 @@ function replaceLiterals(number, literals) {
198198
}
199199

200200
function replacePlaceHolders(formatOptions, info) {
201-
const { start, end, negative, format, decimalIndex, lastZeroIndex, hasNegativeFormat, hasGroup } = formatOptions;
201+
const { start, end, negative, negativeZero, format, decimalIndex, lastZeroIndex, hasNegativeFormat, hasGroup } = formatOptions;
202202
let number = formatOptions.number;
203203
const value = number.toString().split(POINT);
204204
const length = format.length;
@@ -209,7 +209,7 @@ function replacePlaceHolders(formatOptions, info) {
209209

210210
number = format.substring(0, start);
211211

212-
if (negative && !hasNegativeFormat) {
212+
if ((negative || negativeZero) && !hasNegativeFormat) {
213213
number += "-";
214214
}
215215

@@ -273,6 +273,7 @@ export default function customNumberFormat(number, format, info) {
273273
const formatOptions = {
274274
negative: number < 0,
275275
number: Math.abs(number),
276+
negativeZero: (1 / number === -Infinity),
276277
format: format
277278
};
278279

src/numbers/standard-number-format.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ export default function standardNumberFormat(number, options, info) {
9595
value = round(value, maximumFractionDigits);
9696

9797
const negative = value < 0;
98+
const negativeZero = (1 / number === -Infinity);
9899

99100
const parts = value.split(POINT);
100101

@@ -122,7 +123,7 @@ export default function standardNumberFormat(number, options, info) {
122123
pattern = currencyUnitPattern(info, number);
123124
} else {
124125
const patterns = options.patterns;
125-
pattern = negative ? patterns[1] || ("-" + patterns[0]) : patterns[0];
126+
pattern = (negative || negativeZero) ? patterns[1] || ("-" + patterns[0]) : patterns[0];
126127
}
127128

128129
if (pattern === NUMBER_PLACEHOLDER && !negative) {

test/numbers.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,10 @@ describe('formatNumber', () => {
4141
expect(formatNumber(10000)).toEqual("10,000");
4242
});
4343

44+
it('should support minus zero', () => {
45+
expect(formatNumber(-0)).toEqual("-0");
46+
});
47+
4448
it('should return empty string if no value is passed', () => {
4549
expect(formatNumber()).toEqual("");
4650
});
@@ -401,6 +405,10 @@ describe('custom formatting', () => {
401405
expect(formatNumber(10.9, '#')).toEqual("11");
402406
});
403407

408+
it('replaces whole part of the number', () => {
409+
expect(formatNumber(-0, '#')).toEqual("-0");
410+
});
411+
404412
it('replaces # after 0 with 0', () => {
405413
expect(formatNumber(10.1, '#0####')).toEqual("00010");
406414
});
@@ -616,6 +624,22 @@ describe('parseNumber', () => {
616624
expect(parseNumber(value)).toEqual(value);
617625
});
618626

627+
it('returns zero if zero string is passed', () => {
628+
expect(1 / parseNumber('0')).toEqual(Infinity);
629+
});
630+
631+
it('returns negative zero if negative zero string is passed', () => {
632+
expect(1 / parseNumber('-0')).toEqual(-Infinity);
633+
});
634+
635+
it('returns negative zero if negative zero is passed', () => {
636+
expect(1 / parseNumber(-0)).toEqual(-Infinity);
637+
});
638+
639+
it('returns negative zero with accounting format', () => {
640+
expect(1 / parseNumber('$(0.00)', undefined, '$0.00;$(0.00)')).toEqual(-Infinity);
641+
});
642+
619643
it('returns number if number is passed', () => {
620644
const value = 12.12;
621645
expect(parseNumber(value)).toEqual(value);

0 commit comments

Comments
 (0)