strnum
Advanced tools
Comparing version 1.0.4 to 1.0.5
{ | ||
"name": "strnum", | ||
"version": "1.0.4", | ||
"version": "1.0.5", | ||
"description": "Parse String to Number based on configuration", | ||
@@ -20,3 +20,6 @@ "main": "strnum.js", | ||
"author": "Amit Gupta (https://amitkumargupta.work/)", | ||
"license": "MIT" | ||
"license": "MIT", | ||
"devDependencies": { | ||
"jasmine": "^3.10.0" | ||
} | ||
} |
@@ -79,2 +79,9 @@ # strnum | ||
toNumber("+1212121212", { skipLike: /\+[0-9]{10}/} )); //"+1212121212" | ||
``` | ||
Supported Options | ||
```js | ||
hex : true, //when hexadecimal string should be parsed | ||
leadingZeros: true, //when number with leading zeros like 08 should be parsed. 0.0 is not impacted | ||
eNotation: true //when number with eNotation or number parsed in eNotation should be considered | ||
``` |
@@ -6,2 +6,12 @@ const hexRegex = /^[-+]?0x[a-fA-F0-9]+$/; | ||
//polyfill | ||
if (!Number.parseInt && window.parseInt) { | ||
Number.parseInt = window.parseInt; | ||
} | ||
if (!Number.parseFloat && window.parseFloat) { | ||
Number.parseFloat = window.parseFloat; | ||
} | ||
const consider = { | ||
@@ -11,2 +21,3 @@ hex : true, | ||
decimalPoint: "\.", | ||
eNotation: true | ||
//skipLike: /regex/ | ||
@@ -27,3 +38,6 @@ }; | ||
let trimmedStr = str.trim(); | ||
// if(trimmedStr === "0.0") return 0; | ||
// else if(trimmedStr === "+0.0") return 0; | ||
// else if(trimmedStr === "-0.0") return -0; | ||
if(options.skipLike !== undefined && options.skipLike.test(trimmedStr)) return str; | ||
@@ -40,9 +54,54 @@ else if (options.hex && hexRegex.test(trimmedStr)) { | ||
if(match){ | ||
const negative = match[1]; | ||
const sign = match[1]; | ||
const leadingZeros = match[2]; | ||
const num = match[3]; //complete num | ||
let numTrimmedByZeros = trimZeros(match[3]); //complete num without leading zeros | ||
//trim ending zeros for floating number | ||
const eNotation = match[4] || match[6]; | ||
if(leadingZeros.length === 1 && num[0] === ".") return Number(str); | ||
else if(!options.leadingZeros && leadingZeros.length > 0) return str; | ||
else return Number(trimmedStr); | ||
if(!options.leadingZeros && leadingZeros.length > 0 && sign && trimmedStr[2] !== ".") return str; //-0123 | ||
else if(!options.leadingZeros && leadingZeros.length > 0 && !sign && trimmedStr[1] !== ".") return str; //0123 | ||
else{//no leading zeros or leading zeros are allowed | ||
const num = Number(trimmedStr); | ||
const numStr = "" + num; | ||
if(numStr.search(/[eE]/) !== -1){ //given number is long and parsed to eNotation | ||
if(options.eNotation) return num; | ||
else return str; | ||
}else if(eNotation){ //given number has enotation | ||
if(options.eNotation) return num; | ||
else return str; | ||
}else if(trimmedStr.indexOf(".") !== -1){ //floating number | ||
// const decimalPart = match[5].substr(1); | ||
// const intPart = trimmedStr.substr(0,trimmedStr.indexOf(".")); | ||
// const p = numStr.indexOf("."); | ||
// const givenIntPart = numStr.substr(0,p); | ||
// const givenDecPart = numStr.substr(p+1); | ||
if(numStr === "0" && (numTrimmedByZeros === "") ) return num; //0.0 | ||
else if(numStr === numTrimmedByZeros) return num; //0.456. 0.79000 | ||
else if( sign && numStr === "-"+numTrimmedByZeros) return num; | ||
else return str; | ||
} | ||
if(leadingZeros){ | ||
// if(numTrimmedByZeros === numStr){ | ||
// if(options.leadingZeros) return num; | ||
// else return str; | ||
// }else return str; | ||
if(numTrimmedByZeros === numStr) return num; | ||
else if(sign+numTrimmedByZeros === numStr) return num; | ||
else return str; | ||
} | ||
if(trimmedStr === numStr) return num; | ||
else if(trimmedStr === sign+numStr) return num; | ||
// else{ | ||
// //number with +/- sign | ||
// trimmedStr.test(/[-+][0-9]); | ||
// } | ||
return str; | ||
} | ||
// else if(!eNotation && trimmedStr && trimmedStr !== Number(trimmedStr) ) return str; | ||
}else{ //non-numeric string | ||
@@ -54,2 +113,17 @@ return str; | ||
/** | ||
* | ||
* @param {string} numStr without leading zeros | ||
* @returns | ||
*/ | ||
function trimZeros(numStr){ | ||
if(numStr && numStr.indexOf(".") !== -1){//float | ||
numStr = numStr.replace(/0+$/, ""); //remove ending zeros | ||
if(numStr === ".") numStr = "0"; | ||
else if(numStr[0] === ".") numStr = "0"+numStr; | ||
else if(numStr[numStr.length-1] === ".") numStr = numStr.substr(0,numStr.length-1); | ||
return numStr; | ||
} | ||
return numStr; | ||
} | ||
module.exports = toNumber |
@@ -18,2 +18,3 @@ const toNumber = require("./strnum"); | ||
expect(toNumber("+12")).toEqual(12); | ||
expect(toNumber("+ 12")).toEqual("+ 12"); | ||
expect(toNumber("12+12")).toEqual("12+12"); | ||
@@ -44,3 +45,15 @@ expect(toNumber("1212+")).toEqual("1212+"); | ||
expect(toNumber("006", { leadingZeros : false})).toEqual("006"); | ||
expect(toNumber("000000000000000000000000017717" , { leadingZeros : false})).toEqual("000000000000000000000000017717"); | ||
expect(toNumber("000000000000000000000000017717" , { leadingZeros : true})).toEqual(17717); | ||
expect(toNumber("020211201030005811824") ).toEqual("020211201030005811824"); | ||
expect(toNumber("0420926189200190257681175017717") ).toEqual(4.209261892001902e+29); | ||
}) | ||
it("invalid floating number", () => { | ||
expect(toNumber("20.21.030") ).toEqual("20.21.030"); | ||
expect(toNumber("0.21.030") ).toEqual("0.21.030"); | ||
expect(toNumber("0.21.") ).toEqual("0.21."); | ||
expect(toNumber("0.") ).toEqual("0."); | ||
expect(toNumber("1.") ).toEqual("1."); | ||
}); | ||
it("floating point and leading zeros", () => { | ||
@@ -64,2 +77,3 @@ expect(toNumber("0.0")).toEqual(0); | ||
it("negative number leading zeros", () => { | ||
expect(toNumber("+06")).toEqual(6); | ||
expect(toNumber("-06")).toEqual(-6); | ||
@@ -86,5 +100,6 @@ expect(toNumber("-06", { leadingZeros : true})).toEqual(-6); | ||
it("long number", () => { | ||
expect(toNumber("420926189200190257681175017717") ).toEqual(4.209261892001902e+29); | ||
expect(toNumber("000000000000000000000000017717" , { leadingZeros : false})).toEqual("000000000000000000000000017717"); | ||
expect(toNumber("000000000000000000000000017717" , { leadingZeros : true})).toEqual(17717); | ||
expect(toNumber("020211201030005811824") ).toEqual("020211201030005811824"); | ||
expect(toNumber("20211201030005811824") ).toEqual("20211201030005811824"); | ||
expect(toNumber("20.211201030005811824") ).toEqual("20.211201030005811824"); | ||
expect(toNumber("0.211201030005811824") ).toEqual("0.211201030005811824"); | ||
}); | ||
@@ -100,2 +115,6 @@ it("scientific notation", () => { | ||
expect(toNumber("1.0e-2")).toEqual(0.01); | ||
expect(toNumber("420926189200190257681175017717") ).toEqual(4.209261892001902e+29); | ||
expect(toNumber("420926189200190257681175017717" , { eNotation: false} )).toEqual("420926189200190257681175017717"); | ||
}); | ||
@@ -128,2 +147,10 @@ | ||
}) | ||
it("negative numbers", () => { | ||
expect(toNumber("+1212")).toEqual(1212); | ||
expect(toNumber("+12.12")).toEqual(12.12); | ||
expect(toNumber("-12.12")).toEqual(-12.12); | ||
expect(toNumber("-012.12")).toEqual(-12.12); | ||
expect(toNumber("-012.12")).toEqual(-12.12); | ||
}) | ||
}); |
17685
6
268
86
1