[英]How to check if string/number is SIMPLE number
在大多數情況下,對我來說,我只想檢查我得到的字符串/數字是否只是這樣的簡單數字:
0、1、500、-1、1.1、-1.1、1.1013200 等等。
然后安全地轉換它,而不會得到意想不到的結果。
檢查字符串或數字是否為簡單數字的正確方法是什么?
簡單代表:
代碼沙盒。
您可以將其解析為數字,然后再將此數字解析為字符串。 測試兩個變量是否相同后。
對於科學記數法,您可以檢查字符串是否包含“e”或包含“NaN”作為NaN
數字
像:
var num_s = " 898"; var num_n = Number(num_s) var num2_s = "89.8"; var num2_n = Number(num2_s) var num3_s = "1e+23"; var num3_n = Number(num3_s) var num4_s = "NaN"; var num4_n = Number(num4_s) console.log(num_s === String(num_n)) console.log(num2_s === String(num2_n)) console.log(num3_s === String(num3_n) &&.num3_s.includes('e')) console.log(num4_s === String(num4_n) && !num4_s.includes('NaN'))
您可以創建一個函數來測試這種情況,例如
function isSimpleNumber(num_s) {
var num_n = Number(num_s)
if (Number.isNaN(num_n) || num_n > Number.MAX_SAFE_INTEGER || num_n < Number.MIN_SAFE_INTEGER)
return false;
return num_s === String(num_n) && !num_s.includes('e');
}
一個有點“愚蠢”的解決方案,但您可以將輸入轉換為數字並再次檢查它是否看起來像輸入:
function canSafelyConvert(input) { //convert to number const numeric = Number(input); //cannot convert if (Number.isNaN(numeric)) return false; //discard values that are going to cause problems if (numeric > Number.MAX_SAFE_INTEGER || numeric < Number.MIN_SAFE_INTEGER) return false; let canonicalValue = input; if(canonicalValue.includes(".")) { //remove trailing zeries and the decimal dot, if nothing is left after it canonicalValue = canonicalValue.replace(/\.?0+$/g, "") } //check if the converted value seems the same as the input return String(numeric) === canonicalValue; } const testValues = [ //valid "0", "1", "1.000", "500", "-1", "1.1", "-1.1", "1.1013200", //invalid "1e+30", " 1", "080", ".1" ] for (const value of testValues) { console.log(value, ":", canSafelyConvert(value)); }
這將過濾掉轉換為 JavaScript 數字時不同的任何值。
NaN
,您可以安全地丟棄輸出。1.2000
將轉換為1.2
。 如果您得到1.000
轉換為1
,您還必須去除懸空的小數點。 這將包括一些實際上沒有區別的內容,例如, Number(".1")
會產生0.1
,這是正確的轉換,但它被明確提到是不正確的。
感謝@Vlaz 和 R3tep,我組合了一個函數使其工作,唯一的問題是 .1 值,但看不到檢查它的方法,並且它們可以毫無問題地來回轉換,沒關系。
代碼沙盒。
const isSimpleNum = n => {
const nStr = String(n);
const nNum = Number(n);
if (nStr === "-0") return true;
if (nNum > Number.MAX_SAFE_INTEGER || nNum < Number.MIN_SAFE_INTEGER)
return false;
if (nStr === String(nNum) && !["e", "NaN"].some(e => nStr.includes(e))) {
return true;
} else {
return false;
}
};
const isTrue = ["1", "-1", 1, -1, 0, -0, "0", "-0", 1.1, -0.1, "0.1", "-0.1"];
const isFalse = [
"-0,1",
"080",
0.1,
".1",
" 898",
"a",
"1e+23",
"NaN",
undefined,
null,
NaN,
Infinity
];
isTrue.forEach((v, i) => {
if (!isSimpleNum(v)) {
console.log(`isTrue index ${i} as ${v} not passed`);
}
});
console.log("isTrue done");
isFalse.forEach((v, i) => {
if (isSimpleNum(v)) {
console.log(`isFalse index ${i} as ${v} not passed`);
}
});
console.log("isFalse done");
使用正則表達式和Number.MAX_SAFE_INTEGER
let num = '090071'; const regx = /(^0$)|(^[1-9][0-9.-]{1,}$)/; console.log(regx.test(num) && Number(num) <= Number.MAX_SAFE_INTEGER)
只需進行正則表達式檢查:
var reg = /^(0|-?[1-9]\d*\.?\d+)$/;
var value1 = '1e+30';
var value2 = ' 1';
var value3 = '.1';
var value4 = '01';
var value5 = '123';
var value6 = '1.2';
var value7 = '-1.2';
var reg = /^(0|-?[1-9]\d*\.?\d+)$/;
// This should be false
console.log(reg.test(value1))
// This should be false
console.log(reg.test(value2))
// This should be false
console.log(reg.test(value3))
// This should be false
console.log(reg.test(value4))
// This should be true
console.log(reg.test(value5))
// This should be true
console.log(reg.test(value6))
// This should be true
console.log(reg.test(value7))
-?
對於 0 或 1 個 '-' 字符\d+
表示 1 個或多個數字\.?
對於 0 或 1 個小數點分隔符有關更多信息,這里有一個很好的文檔: https ://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.