给定一个字符串
'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/
它有效,但我希望有一个更优雅的解决方案...
答案 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)