从字符串中删除除第一个之外的所有点

时间:2011-11-15 17:34:55

标签: javascript string

给定一个字符串

'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/

它有效,但我希望有一个更优雅的解决方案...

12 个答案:

答案 0 :(得分:16)

有一个很短的解决方案(假设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

答案 1 :(得分:10)

如果支持的浏览器看起来很好,那么使用reg exp会更容易。

使用正则表达式的一种方法:

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

答案 2 :(得分:2)

您可以尝试这样的事情:

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

但是你必须确保字符串中没有使用字符#;或者相应地更换它。

或者,没有上述限制:

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

答案 3 :(得分: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);

晒。

答案 4 :(得分: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;
};

答案 5 :(得分:1)

这是另一种方法:

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

但可以说这是基于副作用,因此并不优雅。

答案 6 :(得分:0)

不确定如果“。”应该发生什么。是第一个字符,我在indexOf中检查-1,如果你使用substr一次也可以使用它两次。

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

答案 7 :(得分:0)

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

有点棘手。使用indexOf如果找不到项目则返回-1的事实。

答案 8 :(得分: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:)在发送到 null 值时只返回 null ,而不是抛出例外。

对于正则表达式,我匹配所有子串,包括(a)字符串的开头+任何潜在数量的非点字符+一个点,或(b)任何现有数量的非点字符。当我们将所有比赛重新加入时,我们基本上删除了除第一个之外的所有点。

答案 9 :(得分:0)

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

答案 10 :(得分: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;
};

答案 11 :(得分:0)

let str = "12.1223....1322311..";

let finStr = str.replace(/(\d*.)(.*)/, '$1') + str.replace(/(\d*.)(.*)/, '$2').replace(/\./g,'');

console.log(finStr)