2011-11-15 34 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; 
}; 
相关问题