backend v4 half
This commit is contained in:
+53
-35
@@ -13,7 +13,7 @@ const consider = {
|
||||
//skipLike: /regex/
|
||||
};
|
||||
|
||||
function toNumber(str, options = {}){
|
||||
export default function toNumber(str, options = {}){
|
||||
options = Object.assign({}, consider, options );
|
||||
if(!str || typeof str !== "string" ) return str;
|
||||
|
||||
@@ -25,23 +25,8 @@ function toNumber(str, options = {}){
|
||||
return parse_int(trimmedStr, 16);
|
||||
// }else if (options.oct && octRegex.test(str)) {
|
||||
// return Number.parseInt(val, 8);
|
||||
}else if (trimmedStr.search(/[eE]/)!== -1) { //eNotation
|
||||
const notation = trimmedStr.match(/^([-\+])?(0*)([0-9]*(\.[0-9]*)?[eE][-\+]?[0-9]+)$/);
|
||||
// +00.123 => [ , '+', '00', '.123', ..
|
||||
if(notation){
|
||||
// console.log(notation)
|
||||
if(options.leadingZeros){ //accept with leading zeros
|
||||
trimmedStr = (notation[1] || "") + notation[3];
|
||||
}else{
|
||||
if(notation[2] === "0" && notation[3][0]=== "."){ //valid number
|
||||
}else{
|
||||
return str;
|
||||
}
|
||||
}
|
||||
return options.eNotation ? Number(trimmedStr) : str;
|
||||
}else{
|
||||
return str;
|
||||
}
|
||||
}else if (trimmedStr.search(/.+[eE].+/)!== -1) { //eNotation
|
||||
return resolveEnotation(str,trimmedStr,options);
|
||||
// }else if (options.parseBin && binRegex.test(str)) {
|
||||
// return Number.parseInt(val, 2);
|
||||
}else{
|
||||
@@ -49,33 +34,42 @@ function toNumber(str, options = {}){
|
||||
const match = numRegex.exec(trimmedStr);
|
||||
// +00.123 => [ , '+', '00', '.123', ..
|
||||
if(match){
|
||||
const sign = match[1];
|
||||
const sign = match[1] || "";
|
||||
const leadingZeros = match[2];
|
||||
let numTrimmedByZeros = trimZeros(match[3]); //complete num without leading zeros
|
||||
const decimalAdjacentToLeadingZeros = sign ? // 0., -00., 000.
|
||||
str[leadingZeros.length+1] === "."
|
||||
: str[leadingZeros.length] === ".";
|
||||
|
||||
//trim ending zeros for floating number
|
||||
|
||||
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 if(options.leadingZeros && leadingZeros===str) return 0; //00
|
||||
|
||||
if(!options.leadingZeros //leading zeros are not allowed
|
||||
&& (leadingZeros.length > 1
|
||||
|| (leadingZeros.length === 1 && !decimalAdjacentToLeadingZeros))){
|
||||
// 00, 00.3, +03.24, 03, 03.24
|
||||
return str;
|
||||
}
|
||||
else{//no leading zeros or leading zeros are allowed
|
||||
const num = Number(trimmedStr);
|
||||
const numStr = "" + num;
|
||||
const parsedStr = String(num);
|
||||
|
||||
if(numStr.search(/[eE]/) !== -1){ //given number is long and parsed to eNotation
|
||||
if( num === 0) return num;
|
||||
if(parsedStr.search(/[eE]/) !== -1){ //given number is long and parsed to eNotation
|
||||
if(options.eNotation) return num;
|
||||
else return str;
|
||||
}else if(trimmedStr.indexOf(".") !== -1){ //floating number
|
||||
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;
|
||||
if(parsedStr === "0") return num; //0.0
|
||||
else if(parsedStr === numTrimmedByZeros) return num; //0.456. 0.79000
|
||||
else if( parsedStr === `${sign}${numTrimmedByZeros}`) return num;
|
||||
else return str;
|
||||
}
|
||||
|
||||
let n = leadingZeros? numTrimmedByZeros : trimmedStr;
|
||||
if(leadingZeros){
|
||||
return (numTrimmedByZeros === numStr) || (sign+numTrimmedByZeros === numStr) ? num : str
|
||||
// -009 => -9
|
||||
return (n === parsedStr) || (sign+n === parsedStr) ? num : str
|
||||
}else {
|
||||
return (trimmedStr === numStr) || (trimmedStr === sign+numStr) ? num : str
|
||||
// +9
|
||||
return (n === parsedStr) || (n === sign+parsedStr) ? num : str
|
||||
}
|
||||
}
|
||||
}else{ //non-numeric string
|
||||
@@ -84,6 +78,32 @@ function toNumber(str, options = {}){
|
||||
}
|
||||
}
|
||||
|
||||
const eNotationRegx = /^([-+])?(0*)(\d*(\.\d*)?[eE][-\+]?\d+)$/;
|
||||
function resolveEnotation(str,trimmedStr,options){
|
||||
if(!options.eNotation) return str;
|
||||
const notation = trimmedStr.match(eNotationRegx);
|
||||
if(notation){
|
||||
let sign = notation[1] || "";
|
||||
const eChar = notation[3].indexOf("e") === -1 ? "E" : "e";
|
||||
const leadingZeros = notation[2];
|
||||
const eAdjacentToLeadingZeros = sign ? // 0E.
|
||||
str[leadingZeros.length+1] === eChar
|
||||
: str[leadingZeros.length] === eChar;
|
||||
|
||||
if(leadingZeros.length > 1 && eAdjacentToLeadingZeros) return str;
|
||||
else if(leadingZeros.length === 1
|
||||
&& (notation[3].startsWith(`.${eChar}`) || notation[3][0] === eChar)){
|
||||
return Number(trimmedStr);
|
||||
}else if(options.leadingZeros && !eAdjacentToLeadingZeros){ //accept with leading zeros
|
||||
//remove leading 0s
|
||||
trimmedStr = (notation[1] || "") + notation[3];
|
||||
return Number(trimmedStr);
|
||||
}else return str;
|
||||
}else{
|
||||
return str;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {string} numStr without leading zeros
|
||||
@@ -94,7 +114,7 @@ function trimZeros(numStr){
|
||||
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);
|
||||
else if(numStr[numStr.length-1] === ".") numStr = numStr.substring(0,numStr.length-1);
|
||||
return numStr;
|
||||
}
|
||||
return numStr;
|
||||
@@ -106,6 +126,4 @@ function parse_int(numStr, base){
|
||||
else if(Number.parseInt) return Number.parseInt(numStr, base);
|
||||
else if(window && window.parseInt) return window.parseInt(numStr, base);
|
||||
else throw new Error("parseInt, Number.parseInt, window.parseInt are not supported")
|
||||
}
|
||||
|
||||
module.exports = toNumber;
|
||||
}
|
||||
Reference in New Issue
Block a user