簡體   English   中英

如何檢查字符串/數字是否為簡單數字

[英]How to check if string/number is SIMPLE number

在大多數情況下,對我來說,我只想檢查我得到的字符串/數字是否只是這樣的簡單數字:

0、1、500、-1、1.1、-1.1、1.1013200 等等。

然后安全地轉換它,而不會得到意想不到的結果。

檢查字符串或數字是否為簡單數字的正確方法是什么?

簡單代表:

  1. 沒有像“1e+30”這樣的科學記數法
  2. 沒有像“1”這樣的空格
  3. 沒有“.1”或“080”和這樣的符號
  4. 限制 js 可以處理的長度,來回轉換結果相同
  5. 其他我可以忘記的東西

代碼沙盒

您可以將其解析為數字,然后再將此數字解析為字符串。 測試兩個變量是否相同后。

對於科學記數法,您可以檢查字符串是否包含“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 數字時不同的任何值。

  1. 如果一個值根本無法轉換,則會產生NaN ,您可以安全地丟棄輸出。
  2. 如果該值太小或太大,則可以將其丟棄,因為使用起來不安全。
  3. 如果輸出看起來沒問題,那么您可以再次將其與輸入進行比較。 您必須去除小數點后的尾隨零,因為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM