string[] ss = { "345.00", "456", "2345.90", "341.56" };
foreach (string s in ss)
{
Console.WriteLine(Regex.Replace(s, @"^(\d*)\d(?:\.\d+)?$",
@"$$${1}9.00"));
}
output:
$349.00
$459.00
$2349.00
$349.00
Первоначально (\d*)
соответствует как можно большему числу цифр и сохраняет их в группе захвата # 1 (например, соответствует 341
в 341.56
).Затем он отступает на одну позицию, чтобы \d
соответствовал последней цифре (группа № 1 теперь содержит только 34
).Наконец, (?:\.\d+)?
соответствует дроби, если она есть (.56
в данном случае).
В подстановке $$
вставляет знак доллара ($
имеет особое значение в подстановках, поэтомувам нужно сбежать с другим $
).${1}
вставляет содержимое группы захвата # 1 (34
в случае 341.56
).Обычно вы можете использовать только $1
, но на этот раз за ссылкой на группу следует другая цифра в подстановке, так что похоже, что я имел в виду группу № 19.Скобки вокруг 1
однозначно говорят, что я хочу группу № 1, за которой следует 9
.Наконец, .00
завершает подстановку.
Это регулярное выражение, которое вы использовали, использует именованные группы захвата, поэтому вы используете ${price1}
вместо ${1}
для вставки первой части числа.Две другие группы захвата не нужны.На самом деле, там много чего не принадлежит.И я вижу, что вы сейчас удаляете дробную часть вместо того, чтобы заменить ее .00
.
Еще одна вещь: вам не нужно звонить IsMatch()
перед началом замены;об этом заботится метод Replace()
.