[英]Remove all dots except the first one from a string
給定一個字符串
'1.2.3.4.5'
我想得到這個 output
'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/
它有效,但我希望有一個更優雅的解決方案......
有一個很短的解決方案(假設input
是您的字符串):
var output = input.split('.');
output = output.shift() + '.' + output.join('');
如果input
為“ 1.2.3.4
”,則output
將等於“ 1.234
”。
請參閱此jsfiddle以獲取證明。 當然,如果發現必要,可以將其包含在函數中。
編輯:
考慮到您的其他要求(如果找不到點,則不要修改輸出),解決方案如下所示:
var output = input.split('.');
output = output.shift() + (output.length ? '.' + output.join('') : '');
這將離開例如。 “ 1234
”(未找到點)保持不變。 有關更新的代碼,請參見此jsfiddle 。
如果支持的瀏覽器落后於其他人,則使用reg exp會容易得多。
使用正則表達式的一種方式:
function process( str ) {
return str.replace( /^([^.]*\.)(.*)$/, function ( a, b, c ) {
return b + c.replace( /\./g, '' );
});
}
您可以嘗試如下操作:
str = str.replace(/\./,"#").replace(/\./g,"").replace(/#/,".");
但是您必須確保在字符串中不使用字符#
。 或相應地更換它。
或沒有以上限制:
str = str.replace(/^(.*?\.)(.*)$/, function($0, $1, $2) {
return $1 + $2.replace(/\./g,"");
});
您也可以這樣做,我也不知道這是否“簡單”,但它僅使用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);
帥
這不一定更優雅,但這是給貓皮擦毛的另一種方式:
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;
};
這是另一種方法:
function process(input) {
var n = 0;
return input.replace(/\./g, function() { return n++ > 0 ? '' : '.'; });
}
但是可以說這是基於副作用的,因此並不是很優雅。
嘗試使其盡可能簡短和可讀,可以執行以下操作:
的JavaScript
var match = string.match(/^[^.]*\.|[^.]+/g);
string = match ? match.join('') : string;
需要第二行代碼,因為如果match()
返回null ,我們將嘗試在null上嘗試調用join()
。 (歡迎改進。)
Objective-J / Cappuccino (JavaScript的超集)
string = [string.match(/^[^.]*\.|[^.]+/g) componentsJoinedByString:''] || string;
可以單行執行此操作,因為它的選擇器(例如componentsJoinedByString:
:)在發送給空值時僅返回空值,而不拋出異常。
至於正則表達式,我正在匹配所有子串, 這些子串由(a) 字符串的開頭+任何可能數量的非點字符+一個點 ,或(b) 任何現有數量的非點字符組成 。 當我們將所有匹配項重新組合在一起時,除第一個點外,我們基本上刪除了任何點。
var input = '14.1.2';
reversed = input.split("").reverse().join("");
reversed = reversed.replace(\.(?=.*\.), '' );
input = reversed.split("").reverse().join("");
基於上述@Tadek的答案。 此功能考慮了其他語言環境。
例如,某些語言環境將逗號用作小數點分隔符,將句點用作千位分隔符(例如-451.161,432e-12
)。
首先,我們轉換除1)以外的任何數字; 2)負號; 3)指數符號變成一個句點( "-451.161.432e-12"
)。
接下來,我們按句點( ["-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;
};
let str = "12.1223....1322311.."; let finStr = str.replace(/(\\d*.)(.*)/, '$1') + str.replace(/(\\d*.)(.*)/, '$2').replace(/\\./g,''); console.log(finStr)
const [integer, ...decimals] = '233.423.3.32.23.244.14...23'.split('.');
const result = [integer, decimals.join('')].join('.')
提供相同的解決方案,但使用擴展運算符。 這是一個見仁見智的問題,但我認為它提高了可讀性。
不知道如果“。”會發生什么。 是第一個字符,我會在indexOf中檢查-1,如果您一次使用substr,那么最好也使用兩次。
if ( index != -1 ) {
input = input.substr( 0, index + 1 ) + input.substr(index + 1).replace( /\./g, '' );
}
var i = s.indexOf(".");
var result = s.substr(0, i+1) + s.substr(i+1).replace(/\./g, "");
有點棘手。 使用以下事實工作:如果找不到該項目, indexOf
返回-1。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.