замена строки символом c # - PullRequest
3 голосов
/ 08 августа 2011

У меня есть строка, где третьим последним символом иногда является ,. В этом случае я хочу заменить его на .. Строка также может содержать другие ,.Есть ли элегантное решение для этого?

РЕДАКТИРОВАТЬ: Спасибо всем за ваши ответы.Просто чтобы уточнить, да под третьим последним я имею в виду строку вида xxxxxx,xx (это европейская валюта)

Ответы [ 4 ]

7 голосов
/ 08 августа 2011

Как насчет:

if (text[text.Length - 3] == ',')
{
    StringBuilder builder = new StringBuilder(text);
    builder[text.Length - 3] = '.';
    text = builder.ToString();
}

РЕДАКТИРОВАТЬ: Я Надеюсь Вышесказанное как раз о наиболее эффективный подход.Вместо этого вы можете попробовать использовать массив символов:

if (text[text.Length - 3] == ',')
{
    char[] chars = text.ToCharArray();
    chars[text.Length - 3] = '.';
    text = new string(chars);
}

Использование Substring также будет работать, но я не думаю, что оно более читабельно:

if (text[text.Length - 3] == ',')
{
    text = text.Substring(0, text.Length - 3) + "."
           + text.Substring(text.Length - 2);
}

РЕДАКТИРОВАТЬ: IВы предполагаете, что в этой ситуации вы уже знаете, что текст будет иметь длину не менее трех символов.Если это не так, вы, очевидно, тоже захотите проверить это.

4 голосов
/ 08 августа 2011
string text = "Hello, World,__";

if (text.Length >= 3 && text[text.Length - 3] == ',')
{
    text = text.Substring(0, text.Length - 3) + "." + text.Substring(text.Length - 2);
}

// text == "Hello, World.__"
2 голосов
/ 08 августа 2011

Более правильный метод, вероятно, будет использовать культуры

string input = "12345,67";
System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo("nl-NL");
decimal value = System.Convert.ToDecimal(input);
System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
string converted = string.Format("{0:C}", value);
1 голос
/ 08 августа 2011

Попробуйте это

System.Text.RegularExpressions.Regex.Replace([the_string], "(,)(.{2})$", ".$2")

Это должно быть сделано, если под «третьим последним символом» вы буквально подразумеваете третий-последний символ во всей строке.

Тем не менее, вам может понадобитьсянастроить, если есть новые строки - например, добавить перечисление RegexOptions.Singleline в качестве дополнительного параметра.

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

static readonly Regex _rxReplace = new Regex("(,)(.{2})$", RegexOptions.Compiled);

Тогда, когда вы захотите использовать это просто:

var fixed = _rxReplace.Replace([the_string], ".$2");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...