<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
給定一個字串如何判斷它是否為數值型別?例如:字串+100、5e2、-123、3.1416以及-1E-16都表示數值,為數值型別,但12e、1a3.14、1.2.3、+-5以及12e+5.4都不是。
本文將帶著大家實現這個判斷演演算法,歡迎各位感興趣的開發者閱讀本文。
我們先來看一下數值的定義規則:表示數值的字串遵循模式A[.[B]][e|EC]或者.B[e|EC],其中:
在小數裡可能沒有數值的整數部分,例如:小數.123等於0.123。因此A部分不是必須的,如果一個數沒有整數部分,那麼它的小數部分不能為空。
上述A和C都是可能以+或者-開頭的0~9的數位串;B也是0~9的數位串,但前面不能有正負號。我們以字串123.45e+6為例,其中:
判斷一個字串是否符合上述模式時,首先儘可能多地掃描0~9的數位(有可能起始處有+或者-),也就是前面模式中表示數值整數的A部分。如果遇到小數點.,則開始掃描表述數值小數部分的B部分。如果遇到e或者E,則開始掃描表示數值指數的C部分。
我們將上面所述整理下,就能列出實現思路了,如下所示:
(1) 在字串後新增結束標誌;
(2) 使用全域性索引遍歷字串;
(3) 設計一個函數用來掃描無符號整數(字串中0~9的數位),用來判斷數值模式中的B部分;
(4) 設計一個函數用來掃描可以表示正負的+或者-為起始的0~9的數位(類似於一個可能帶正負符號的整數),用來判斷數值模式中的A和C部分;
(5) 從頭開始掃描字串,跳過首部空格,掃一次全域性索引自增一次:
(6) 跳過尾部空格;
(7) 判斷校驗結果是否為true以及全域性索引自增到了結束標識處。
接下來,我們以123.45e+6為例,畫一下上述流程的執行過程,如下所示:
萬事俱備,接下來,我們來看下程式碼實現。
掃描無符號整數函數的程式碼如下所示:
export class NumericalCheck { // 指標索引 private index = 0; // 掃描無符號整數 private scanUnsignedInteger(str: string): boolean { const before = this.index; while (str.charAt(this.index) >= "0" && str.charAt(this.index) <= "9") { this.index++; } return this.index > before; } }
掃描有符號整數函數是在無符號的基礎上新增符號的判斷,其如下所示:
// 掃描有符號整數 private scanInteger(str: string): boolean { // 判斷其是否包含正負號 if (str.charAt(this.index) == "+" || str.charAt(this.index) == "-") { this.index++; } // 掃描無符號整數 return this.scanUnsignedInteger(str); }
最後,從頭到尾遍歷字串,結合上述兩個函數,判斷字串是否為數值,其程式碼如下所示:
public isNumber(numStr: string): boolean { if (numStr == null || numStr.length == 0) { return false; } // 新增結束標誌 numStr = numStr + "|"; // 跳過首部的空格 while (numStr.charAt(this.index) == " ") { this.index++; } // 掃描整數部分 let numeric = this.scanInteger(numStr); // 有小數點,處理小數部分 if (numStr.charAt(this.index) == ".") { this.index++; // 小數兩邊只要有一邊有數位即可,所以用|| numeric = this.scanUnsignedInteger(numStr) || numeric; } // 有e||E,處理指數部分 if (numStr.charAt(this.index) == "E" || numStr.charAt(this.index) == "e") { this.index++; // e || E兩邊都要有數位,所以用&& numeric = numeric && this.scanInteger(numStr); } // 跳過尾部空格 while (numStr.charAt(this.index) == " ") { this.index++; } const checkResult = numeric && numStr.charAt(this.index) == "|"; // 重置指標索引 this.index = 0; return checkResult; }
完整程式碼請移步: NumericalCheck.ts 。
接下來,我們舉幾個例子,將其帶入上述程式碼中,看下它能否正確執行,如下所示:
let str = "123.45e+6"; const numericalCheck = new NumericalCheck(); let checkResult = numericalCheck.isNumber(str); printCheckResult(); str = " .12e1 "; checkResult = numericalCheck.isNumber(str); printCheckResult(); str = "12e"; checkResult = numericalCheck.isNumber(str); printCheckResult(); str = "1.2.3"; checkResult = numericalCheck.isNumber(str); printCheckResult(); function printCheckResult() { console.log(`字串 ${str}是否為數值校驗結果為:${checkResult}`); }
執行結果如下所示:
範例程式碼文中所舉程式碼的完整版請移步:
到此這篇關於詳解Java如何實現數值校驗的演演算法的文章就介紹到這了,更多相關Java數值校驗演演算法內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45