2011-11-15 35 views
14

第一個給定一個字符串刪除所有的點,除了從字符串

'1.2.3.4.5' 

我想獲得這個輸出

'1.2345' 

(如果有字符串中沒有點,字符串應該原封不動地返回。)

我寫這

function process(input) { 
    var index = input.indexOf('.'); 

    if (index > -1) { 
     input = input.substr(0, index + 1) + 
       input.slice(index).replace(/\./g, ''); 
    } 

    return input; 
} 

現場演示:http://jsfiddle.net/EDTNK/1/

它的工作原理,但我希望一個稍微更優雅的解決方案......

+2

我覺得你現有的解決方案也相當考究加入 –

+0

我同意 - 你的解決方案似乎沒什麼問題 –

+0

@邁克爾的解決方案使用'indexOf','substr'。 ,'slice'和'replace',加上'if'語句,我覺得它不是t儘可能簡單...... –

回答

9

這將是一個容易得多具有reg EXP如果瀏覽器支持一下屁股。用正則表達式

方式一:

function process(str) { 
    return str.replace(/^([^.]*\.)(.*)$/, function (a, b, c) { 
     return b + c.replace(/\./g, ''); 
    }); 
} 
+0

一些瀏覽器支持回頭看? –

+0

哎呀,所有人都不應該去那裏。 :) – epascarello

+0

我相信這是一個明確的答案。正則表達式似乎是最佳的。 –

1

你也可以做這樣的事情,我也不知道這是不是「簡單「,但它只使用indexOf,replace和substr。

var str = "7.8.9.2.3"; 
var strBak = str; 

var firstDot = str.indexOf("."); 
str = str.replace(/\./g,""); 
str = str.substr(0,firstDot)+"."+str.substr(1,str.length-1); 

document.write(str); 

Shai。

+0

仍然有四個方法調用('indexOf','replace'和'substr'兩次)。我想把這個數字減少到1-2個調用... –

+0

這是壞的。對於''abcd.efgh'''str.substr(1,...)'部分顯然是錯誤的。當字符串沒有點時也不起作用。 – 6502

+0

這當然只是他具體測試案例的基本測試,正如我一直說的 - 我沒有正確的解決方案,我正確的方向。 SO不是爲人們寫解決方案,而是分享想法和經驗(至少我是這麼看的)。 無論如何,正如我所說我不認爲它更好,如果它,可能不是太多。 –

0

不確定如果「。」會出現什麼情況。是第一個字符,我會在indexOf中檢查-1,如果你使用substr,那麼一次不妨使用它兩次。

if (index != -1) { 
    input = input.substr(0, index + 1) + input.substr(index + 1).replace(/\./g, ''); 
} 
+0

啊,是的,沒錯。 (雖然應該評論) –

1

這不一定是更優雅,但它的另一種方法對皮膚的貓:

var process = function (input) { 
    var output = input; 

    if (typeof input === 'string' && input !== '') { 
     input = input.split('.'); 
     if (input.length > 1) { 
      output = [input.shift(), input.join('')].join('.'); 
     } 
    } 

    return output; 
}; 
+0

我忘了提及,但我希望這也可以在沒有點的情況下工作(在這種情況下,輸入應該不變地返回)... –

+0

@ŠimeVidas更新爲該帳戶 – JAAulde

1

這裏是另一種方法:

function process(input) { 
    var n = 0; 
    return input.replace(/\./g, function() { return n++ > 0 ? '' : '.'; }); 
} 

但可以說,這是基於副作用,因此並不真正優雅。

+0

副作用?.. –

+0

回調取決於並改變了'n' ...我認爲這可以被認爲是副作用。 –

0
var i = s.indexOf("."); 
var result = s.substr(0, i+1) + s.substr(i+1).replace(/\./g, ""); 

有點棘手。如果未找到該項目,則使用indexOf返回-1這一事實工作。

15

有一個很短的解決方案(假設input是你的字符串):

var output = input.split('.'); 
output = output.shift() + '.' + output.join(''); 

如果input是 「1.2.3.4」,然後output將等於 「1.234」。

請參閱this jsfiddle作爲證明。當然,如果你覺得有必要,你可以把它放在一個函數中。

編輯:

考慮到您的附加要求(以如果沒有發現點不改變輸出),該解決方案可以是這樣的:

var output = input.split('.'); 
output = output.shift() + (output.length ? '.' + output.join('') : ''); 

這將留下如。 「1234」(未找到點)不變。有關更新的代碼,請參閱this jsfiddle

+0

我忘了提,但我希望這也可以在沒有點的情況下工作(在這種情況下,輸入應該不變地返回)... –

+0

@ŠimeVidas:我現在的解決方案只解決了你沒有的問題忘了提及。我會看看它,並試圖考慮到這一點。 – Tadeck

+0

@ŠimeVidas:完成,請查看。 – Tadeck

1

你可以嘗試這樣的事情:

str = str.replace(/\./,"#").replace(/\./g,"").replace(/#/,"."); 

但是你必須要確保字符#字符串中不使用;或者相應地更換它。

還是這,沒有上述限制:

str = str.replace(/^(.*?\.)(.*)$/, function($0, $1, $2) { 
    return $1 + $2.replace(/\./g,""); 
}); 
+0

這可能是最終的方式來做到這一點... –

+0

@ŠimeVidas:可能;但是,在看到所有這些偉大的答案之後,我很確定沒有確定的方法來做到這一點。 –

+0

我接受了一個類似的答案,它使用了更準確的正則表達式,我相信。 –

0

試圖保持這個短和可讀性越好,你可以做到以下幾點:

的JavaScript

var match = string.match(/^[^.]*\.|[^.]+/g); 
string = match ? match.join('') : string; 

要求第二行代碼,因爲如果match()返回null ,我們會嘗試撥打join()null。 (改進的歡迎。)

目的-J /卡布奇諾(JavaScript的超集)

string = [string.match(/^[^.]*\.|[^.]+/g) componentsJoinedByString:''] || string; 

可以做一個單一的線,因爲它的選擇(如componentsJoinedByString:)簡單地返回當發送到空值值,而不是拋出異常。

至於正則表達式,我匹配所有子串包括或者(a)的字符串的開始+的非點的字符的任何潛在數量+點,或(b)任何的現有的非點號字符數。當我們將所有比賽連接在一起時,我們基本上除去了第一個點外的任何點。

0
var input = '14.1.2'; 
reversed = input.split("").reverse().join(""); 
reversed = reversed.replace(\.(?=.*\.), ''); 
input = reversed.split("").reverse().join(""); 
0

基於@ Tadek的回答上面。該功能考慮了其他地區。


例如,某些區域設置將用於小數分隔逗號和週期爲千個分離器(例如-451.161,432e-12)。

首先,我們轉換除1)號碼以外的任何其他東西; 2)負號; 3)指數符號進入一段時間("-451.161.432e-12")。

接下來,我們通過分裂週期(["-451", "161", "432e-12"])和彈出最右邊的值("432e-12"),然後用剩下的("-451161.432e-12"

(請注意,我折騰出千個分隔符的加入,但這些。可以很容易地在加入步驟(.join(',')

var ensureDecimalSeparatorIsPeriod = function (value) { 
    var numericString = value.toString(); 
    var splitByDecimal = numericString.replace(/[^\d.e-]/g, '.').split('.'); 
    if (splitByDecimal.length < 2) { 
     return numericString; 
    } 
    var rightOfDecimalPlace = splitByDecimal.pop(); 
    return splitByDecimal.join('') + '.' + rightOfDecimalPlace; 
}; 
相關問題