Javascript Regex: замена последней точки запятой

У меня есть следующий код:

var x = "100.007"
x = String(parseFloat(x).toFixed(2));
return x
=> 100.01

Это работает потрясающе именно так, как я хочу, чтобы это работало. Я просто хочу крошечное дополнение, что-то вроде:

var x = "100,007"
x.replace(",", ".")
x.replace
x = String(parseFloat(x).toFixed(2));
x.replace(".", ",")
return x
=> 100,01

Однако этот код заменит первое вхождение ",", где я хочу поймать последнее. Любая помощь будет оценена по достоинству.


person Shyam    schedule 30.01.2011    source источник


Ответы (5)


Вы можете сделать это с помощью регулярного выражения:

x = x.replace(/,([^,]*)$/, ".$1");

Это регулярное выражение соответствует запятой, за которой следует любое количество текста, кроме запятой. Строка замены — это просто точка, за которой следует то, что было после исходной последней запятой. Другие запятые, предшествующие ему в строке, не будут затронуты.

Теперь, если вы действительно конвертируете числа, отформатированные в «европейском стиле» (из-за отсутствия лучшего термина), вам также нужно будет беспокоиться о «.». символы в местах, где в номере «американского стиля» были бы запятые. Я думаю, вы, вероятно, просто захотите избавиться от них:

x = x.replace(/\./g, '');

Когда вы используете функцию ".replace()" для строки, вы должны понимать, что она возвращает измененную строку. Однако он не изменяет исходную строку, поэтому такой оператор, как:

x.replace(/something/, "something else");

не влияет на значение "x".

person Pointy    schedule 30.01.2011
comment
Обязательно избавьтесь от символов точки ПЕРЕД преобразованием запятой в единицу, иначе вы получите совершенно другое число! Там должно быть регулярное выражение, которое преобразует точки, только если за ними следует запятая, и преобразует запятую, только если ей предшествуют точки... Думаю, я только что нашел, что я делаю со своим обеденным перерывом... - person RyanfaeScotland; 14.10.2014

Вы можете сделать это с помощью функции lastIndexOf(), чтобы найти последнее вхождение , и заменить его.

Альтернативой является использование регулярного выражения с маркером конца строки:

myOldString.replace(/,([^,]*)$/, ".$1");
person Mike Dinescu    schedule 30.01.2011
comment
Это работает? Первый ',' тоже будет иметь конец строки где-то после него. - person GolezTrol; 30.01.2011

Вы можете использовать lastIndexOf, чтобы найти последнее вхождение ,. Затем вы можете использовать slice, чтобы поместить часть до и после , вместе с . между ними.

person GolezTrol    schedule 30.01.2011
comment
Разве регулярное выражение не было бы лучше, так как это совпадение с образцом, которое я ищу? - person Shyam; 30.01.2011

Вы можете использовать регулярное выражение. Вы хотите заменить последний ',', поэтому основная идея состоит в том, чтобы заменить ',', после которого нет ','.

x.replace(/,([^,]*)$/, ".$1");

Вернет то, что вы хотите :-).

person p4bl0    schedule 30.01.2011

Вам не нужно беспокоиться о том, является ли это последним «.», потому что он только один. JavaScript не хранит числа внутри с наборами, разделенными запятыми или точками.

person coreyward    schedule 30.01.2011
comment
Правило номер один — никогда не доверять входным данным. Так что я волнуюсь :) Тем не менее, спасибо за ваш ответ. - person Shyam; 30.01.2011
comment
Входные данные не имеют значения — вы запускаете replace на выходе String(parseFloat(n).toFixed(2)), который всегда будет возвращать строковое представление либо nil, либо числа с одним десятичным знаком и нулевыми запятыми. JavaScript НИКОГДА не преобразует число в строку с разделителями-запятыми, если только вы не напишете специальный метод для этого. - person coreyward; 30.01.2011