Удалите все точки, кроме первого, из строки
Для строки
'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;
}
Live demo: http://jsfiddle.net/EDTNK/1/
Это работает, но я надеялся на немного более элегантное решение...
Ответы
Ответ 1
Было бы намного проще с reg exp, если браузеры поддерживали внешний вид.
Один из способов с регулярным выражением:
function process( str ) {
return str.replace( /^([^.]*\.)(.*)$/, function ( a, b, c ) {
return b + c.replace( /\./g, '' );
});
}
Ответ 2
Существует довольно короткое решение (предполагая, что input
- ваша строка):
var output = input.split('.');
output = output.shift() + '.' + output.join('');
Если input
- "1.2.3.4
", то output
будет равно "1.234
".
См. этот jsfiddle для доказательства. Конечно, вы можете заключить его в функцию, если вы сочтете это необходимым.
EDIT:
Принимая во внимание ваше дополнительное требование (чтобы не изменять вывод, если точка не найдена), решение может выглядеть следующим образом:
var output = input.split('.');
output = output.shift() + (output.length ? '.' + output.join('') : '');
который выйдет, например. "1234
" (точка не найдена) без изменений. См. этот jsfiddle для обновленного кода.
Ответ 3
Вы можете попробовать что-то вроде этого:
str = str.replace(/\./,"#").replace(/\./g,"").replace(/#/,".");
Но вы должны быть уверены, что символ #
не используется в строке; или заменить его соответствующим образом.
Или это, без вышеуказанного ограничения:
str = str.replace(/^(.*?\.)(.*)$/, function($0, $1, $2) {
return $1 + $2.replace(/\./g,"");
});
Ответ 4
Вы также можете сделать что-то подобное, я также не знаю, является ли это "более простым", но он использует только 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);
Шай.
Ответ 5
Это не обязательно более элегантно, но это еще один способ обмануть кошку:
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;
};
Ответ 6
Вот еще один подход:
function process(input) {
var n = 0;
return input.replace(/\./g, function() { return n++ > 0 ? '' : '.'; });
}
Но можно сказать, что это основано на побочных эффектах и поэтому не очень изящно.
Ответ 7
Не уверен, что должно произойти, если "." это первый символ, я проверил бы -1 в indexOf, также если вы используете substr один раз, можете использовать его дважды.
if ( index != -1 ) {
input = input.substr( 0, index + 1 ) + input.substr(index + 1).replace( /\./g, '' );
}
Ответ 8
var i = s.indexOf(".");
var result = s.substr(0, i+1) + s.substr(i+1).replace(/\./g, "");
Несколько сложнее. Работает с использованием того факта, что indexOf
возвращает -1, если элемент не найден.
Ответ 9
Попытка сделать это максимально коротким и читаемым, вы можете сделать следующее:
JavaScript
var match = string.match(/^[^.]*\.|[^.]+/g);
string = match ? match.join('') : string;
Требуется вторая строка кода, потому что если match()
возвращает значение null, мы получим исключение, пытающееся вызвать join()
на null. (Усовершенствования приветствуются.)
Objective-J/Cappuccino (надмножество JavaScript)
string = [string.match(/^[^.]*\.|[^.]+/g) componentsJoinedByString:''] || string;
Можно сделать это в одной строке, потому что его селекторы (например, componentsJoinedByString:
) просто возвращают null при отправке в нулевое значение, а не бросают исключение.
Что касается регулярного выражения, я сопоставляю все подстроки, состоящие из (a) начала строки + любого потенциального числа неточечных символов + точки или (b) любого существующего числа неточечных персонажи. Когда мы присоединяем все совпадения назад, мы по существу удалили любую точку, кроме первой.
Ответ 10
var input = '14.1.2';
reversed = input.split("").reverse().join("");
reversed = reversed.replace(\.(?=.*\.), '' );
input = reversed.split("").reverse().join("");
Ответ 11
Основываясь на ответе @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;
};
Ответ 12
let str = "12.1223....1322311..";
let finStr = str.replace(/(\d*.)(.*)/, '$1') + str.replace(/(\d*.)(.*)/, '$2').replace(/\./g,'');
console.log(finStr)