2015-04-05 74 views
2

我有逗號分隔的浮點數。將浮點數排序爲自然數

var example = "1.1, 1.10, 1.2, 3.1, 3.14, 3.5"; 

,我想這個浮點數像排序,

"1.1, 1.2, 1.10, 3.1, 3.5, 3.14" 
在我的情況

實際上,這是小數後的數字將考慮作爲一個自然數,所以1.2將考慮爲「2」而1.10會被認爲是'10',這就是爲什麼1.2會首先超過1.10。

和建議或例子將是偉大的我,謝謝。

其實我想先根據小數前的數字對數組進行排序:)然後上面的邏輯就會運行。

回答

5

您可以使用.sort自定義比較函數,像這樣

var example = "1.1, 1.10, 1.2, 3.1, 3.14, 3.5"; 
 

 
var res = example.split(',').sort(function (a, b) { 
 
    var result; 
 
    
 
    a = a.split('.'), 
 
    b = b.split('.'); 
 

 
    while (a.length) { 
 
    result = a.shift() - (b.shift() || 0); 
 
    
 
    if (result) { 
 
     return result; 
 
    } 
 
    } 
 

 
    return -b.length; 
 
}).join(','); 
 

 
console.log(res);

+0

完美(Y)謝謝男人 – 2015-04-05 09:51:22

2

您需要一個自定義的排序函數,它首先比較小數點前的數值,然後比較小數點後面的數值,以防它們相等。

example.split(", ").sort(function (a, b) { 
    var aParts = a.split(".", 2); 
    var bParts = b.split(".", 2); 
    if (aParts[0] < bParts[0]) return -1; 
    if (aParts[0] > bParts[0]) return 1; 
    return aParts[1] - bParts[1]; // sort only distinguishes < 0, = 0 or > 0 
}).join(", "); 
+0

你的例子正與1位小數後,不超過1個位數。這裏是你的示例實現:) http://jsbin.com/qolapumaxa/1/edit – 2015-04-05 09:49:29

+0

你應該簡單地將'console.log'作爲上述表達式的值。我分別得到了1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9,1.10,1.11,1.12,1.13,1.14,1.15,1.16,1.17,1.18,2.1,2.2,2.3,2.4,2.5,2.6等等,2.7,2.8,2.9,2.10,2.11,3.1,3.2,3.3,3.4,3.5,3.6,3.7'。 – 2015-04-05 09:55:25

+0

當然,如果您的輸入可以有多個小數點,例如'1.2.34',那麼你應該使用亞歷山大的代碼。但你最初的問題沒有提到這種可能性。 – 2015-04-05 09:58:17