Справка по регулярным выражениям - PullRequest
0 голосов
/ 25 августа 2010

Мне нужна помощь в регулярных выражениях, подборе и замене шаблонов.Я работаю над ставками.
мои ставки могут быть такими, как

345.00
456
2345.90
341.34

. Я должен проверить, заканчивается ли ставка на 9, если нет, я должен закончить ставку с 9 и символом $.

Ставки после запуска правила должны стать

$349.00
$459.00
$2349.00
$339.00

Я сохраняю ставку в виде строки, чтобы было легко использовать функцию Regex.IsMatch.

может кто-нибудь дать мне регулярное выражение для matchpattern и заменить шаблон.

Я борюсь с этим уже полдня и мне нужна помощь.

Спасибо, Суджата

Ответы [ 3 ]

1 голос
/ 25 августа 2010

Более простой и интуитивно понятный способ - использовать целочисленную арифметику:

// convert amount to int, then:
amount = amount - (amount % 10) + 9
// or more succintly
amount += 9 - (amount % 10)

И это даст вам то, что вы хотите. Затем вы можете использовать String.Format(), чтобы получить форматирование валюты:

public static String ToMoney(string amount) 
{
    int x = Convert.ToInt32(double.Parse(amount));
    x += 9 - (x%10);
    return String.Format("{0:C}", x);
}

См. Это в действии на ideone

1 голос
/ 25 августа 2010
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().

0 голосов
/ 25 августа 2010

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

Сначала давайте избавимся от поплавка:

s/\..*$//

Тогда давайте обработаем '9':

s/.$/9/

Наконец, добавьте '$' и '.00':

s/^/$/
s/$/.00/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...