3 Stimmen

c# string zeichen ersetzen

Ich habe eine Zeichenfolge, bei der das drittletzte Zeichen manchmal ein , Wenn dies der Fall ist, möchte ich sie durch eine . Die Zeichenfolge könnte auch andere , durch. Gibt es eine elegante Lösung für dieses Problem?

EDIT: Danke an alle für die Antworten. Nur um das klarzustellen, ja, mit drittletztem meine ich eine Zeichenkette in der Form xxxxxx,xx (es ist eine europäische Währungssache)

7voto

Jon Skeet Punkte 1325502

Wie wäre es damit:

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

EDIT: I Hoffnung Die obige Vorgehensweise ist so ziemlich die effizienteste. Sie könnten versuchen, stattdessen ein Char-Array zu verwenden:

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

Verwendung von Substring funktioniert zwar auch, aber ich glaube nicht, dass es besser lesbar ist:

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

EDIT: Ich bin davon ausgegangen, dass Sie in dieser Situation bereits wissen, dass der Text mindestens drei Zeichen lang sein wird. Wenn das nicht der Fall ist, würden Sie offensichtlich wollen einen Test für das auch.

4voto

dtb Punkte 205441
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.__"

2voto

MrFox Punkte 4634

Eine geeignetere Methode wäre wahrscheinlich die Verwendung der Kulturen

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);

1voto

Andras Zoltan Punkte 41403

Versuchen Sie dies

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

Es sollte funktionieren, wenn Sie mit "drittletztes Zeichen" buchstäblich das drittletzte Zeichen in der gesamten Zeichenkette meinen.

Allerdings müssen Sie möglicherweise neue Zeilen einfügen, z. B. die RegexOptions.Singleline enum als zusätzlichen Parameter.

Für eine bessere Leistung - wahrscheinlich - könnten Sie die Regex innerhalb eines Klassenkörpers vordeklarieren:

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

Wenn man es dann benutzen will, ist es einfach:

var fixed = _rxReplace.Replace([the_string], ".$2");

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X