Skip to content

Commit 775ba8a

Browse files
authored
fix: parseNumber fails with specific percent numbers (#125)
1 parent b076537 commit 775ba8a

File tree

2 files changed

+39
-1
lines changed

2 files changed

+39
-1
lines changed

src/numbers/parse-number.js

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,20 @@ function cleanLiterals(number, formatOptions) {
7070
return result;
7171
}
7272

73+
function divideBy100(number) {
74+
const strNumber = String(number);
75+
const pointIndex = strNumber.indexOf(POINT);
76+
const zeroesCount = 2;
77+
let result = number / Math.pow(10, zeroesCount);
78+
79+
if (pointIndex === -1 || String(result).length <= strNumber.length + zeroesCount) {
80+
return result;
81+
}
82+
83+
const fractionDigits = strNumber.length - pointIndex + 1 + zeroesCount;
84+
return parseFloat(result.toFixed(fractionDigits));
85+
}
86+
7387
export default function parseNumber(value, locale = DEFAULT_LOCALE, format = {}) {
7488
if (!value && value !== 0) {
7589
return null;
@@ -130,7 +144,7 @@ export default function parseNumber(value, locale = DEFAULT_LOCALE, format = {})
130144
}
131145

132146
if (number && isPercent) {
133-
number /= 100;
147+
number = divideBy100(number);
134148
}
135149

136150
return number;

test/numbers.test.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -776,6 +776,30 @@ describe('parseNumber', () => {
776776
expect(parseNumber("1,23432e+5", "bg")).toEqual(123432);
777777
});
778778

779+
it("parses 0.70% to percent", () => {
780+
expect(parseNumber('0.70%')).toEqual(0.007);
781+
});
782+
783+
it("parses 0.14% to percent", () => {
784+
expect(parseNumber('0.14%')).toEqual(0.0014);
785+
});
786+
787+
it("parses 0.141% to percent", () => {
788+
expect(parseNumber('0.141%')).toEqual(0.00141);
789+
});
790+
791+
it("parses 0.68% to percent", () => {
792+
expect(parseNumber('0.68%')).toEqual(0.0068);
793+
});
794+
795+
it("parses 17.17% to percent", () => {
796+
expect(parseNumber('17.17%')).toEqual(0.1717);
797+
});
798+
799+
it("parses 0.1234567891245% to percent", () => {
800+
expect(parseNumber('0.1234567891245%')).toEqual(0.001234567891245);
801+
});
802+
779803
describe('errors', () => {
780804
beforeAll(() => {
781805
cldr.supplemental.currencyData.region.CUSTOM = [{ XXX: {} }];

0 commit comments

Comments
 (0)