C#字符串字符替换

3
我有一个字符串,其中倒数第三个字符有时是 ,。如果是这种情况,我想用 . 替换它。该字符串可能还有其他的 ,。是否有一种优雅的解决方案?
编辑:感谢大家的答案。只是为了澄清,是的,我指的是形式为 xxxxxx,xx 的字符串(这是欧洲货币问题)。

需要替换的逗号是否总是出现在倒数第三个位置(如果有的话)? - Fredrik Mörk
1
你能发一个字符串的例子吗? - user195488
@Fredrik - 是的,它将始终出现在倒数第三个位置。 - probably at the beach
如果您有十进制值(因为您在编辑中谈论货币),使用正确的区域设置进行 string.Format("{0:0.00}", 275.95, System.Globalization.CultureInfo.CreateSpecificCulture("nl-BE")); 不是更清晰吗?此示例将返回 275,95。 - Peter
4个回答

7
如何考虑以下情况:
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);
}

编辑:在这种情况下,我一直假设您已经知道文本长度至少为三个字符。如果不是这样的话,您显然也需要进行测试。


@代码:与什么相比较沉重?我想不出更有效的方法了 - 你能吗? - Jon Skeet
2
+1 - 如果操作符表示倒数第三个,那么这似乎是目前唯一可行的解决方案。 - JonH
@Jon:简单的字符串拼接? - user195488
@Jon Skeet - 不用费力问,通常那些点踩的人不会告诉你为什么他们这么做... - JonH
@代码:在这种情况下,我认为这样做不会更易读,而且我的文章重点是针对已经具备连接所需值的情况。但在这种情况下,我们没有 - 我们必须创建子字符串。 - Jon Skeet
显示剩余3条评论

4
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
+1 但他说“倒数第三个字符”,所以我不知道这是否意味着倒数第三个字符。 - user195488
+1 @dtb - 很棒的回答。很抱歉我不能给出两个正确的回复。 - probably at the beach

2

更为恰当的方法可能是使用文化(cultures)

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。当OP编辑问题以包含他实际想要的内容时,我确实考虑过这个问题。 - Andras Zoltan

1

试试这个

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接