2014-11-07 116 views
1

在Javascript中,我試圖創建一個函數,它將查找字符串中最長的數字並將其轉換爲浮點值。但是,當我輸入ff333sds22442之類的東西時,它應該輸出「333」作爲最長的數字,它應該輸出22442Javascript,查找字符串中的最大數字序列

<input type="text" id="numberInput"></input> 
<button onclick="findNumber()"> Find Number </button> 
<button onclick="makeSubstring()"> Make Substring </button> 
<p id="number"></p> 

<script> 

function findNumber() { 
    var input = document.getElementById("numberInput").value; 
    var longest = ""; 
    var result = ""; 
    var inputSub = ""; 

    for (var i = 0; i < input.length; i++) { 
     for (var j = i + 1; j < input.length; j++) { 

      inputSub = input.substring(i, j + 1); 
      if (!isNaN(parseFloat(inputSub)) && inputSub.length > longest.length){ 
       longest = inputSub; 
       result = inputSub; 
      } 
     } 
    } 

    result = parseFloat(result); 
    document.getElementById("number").innerHTML = result; 
} 

我不確定它爲什麼這樣做,我希望有人能解釋給我。

+0

除了是不是很有效,有開始,當你比較'inputSub.length'你正在比較子字符串的長度,而不是* parsed * float的長度。所以結果總是最終成爲原始字符串(因爲它是最長的)。並且'parseFloat'就會給你找到的第一個數字(即'333') – 2014-11-07 02:21:58

+0

有沒有更有效的方法來排序這個我應該用? – 2014-11-07 02:29:11

回答

0

這不能正常工作的原因是,您正在測試以查看parseFloat(inputSub)是否爲NaN。這不起作用,因爲parseFloat('333sds')將返回333,而不是NaN

documentationparseFloat包含您可以用它來修復你的函數的bug嚴格的解析函數:

var filterFloat = function (value) { 
    if(/^(\-|\+)?([0-9]+(\.[0-9]+)?|Infinity)$/ 
     .test(value)) 
     return Number(value); 
    return NaN; 
} 

console.log(filterFloat('421'));    // 421 
console.log(filterFloat('-421'));    // -421 
console.log(filterFloat('+421'));    // 421 
console.log(filterFloat('Infinity'));   // Infinity 
console.log(filterFloat('1.61803398875'));  // 1.61803398875 
console.log(filterFloat('421e+0'));   // NaN 
console.log(filterFloat('421hop'));   // NaN 
console.log(filterFloat('hop1.61803398875')); // NaN 
+0

啊!疑難雜症!謝謝一堆。 – 2014-11-07 02:42:25

+0

沒問題。我只是用一些可以幫助你解決問題的東西給我的答案添加了一個編輯,如果你還沒有遇到這些問題,它會向你介紹正則表達式。 – devuxer 2014-11-07 02:43:56

+0

我還沒有遇到正則表達式。我希望你不是在談論那裏的if語句,因爲那看起來很骯髒,我不想很快再遇到它。 – 2014-11-07 02:48:07