Подтвердить что ты не робот

Удалите все точки, кроме первого, из строки

Для строки

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

Это работает, но я надеялся на немного более элегантное решение...

4b9b3361

Ответ 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)