簡體   English   中英

從字符串中刪除除第一個點以外的所有點

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM