C#如何用另一个字符串的一部分替换字符串中的某些部分

3
使用C#,最高效的完成此任务的方法是什么?
string one = "(999) 999-9999";
string two = "2221239876";

// combine these into result

result = "(222) 123-9876"

第一个字符串中始终包含数字9。

我考虑使用foreach循环遍历第一个字符串,当遇到数字9时,将其替换为第二个字符串中的下一个字符。不过,我还不确定接下来该怎么做...


问号是否意味着第一个位置可能有数字,也可能没有数字。例如,使用掩码9?9999的0123将导致0123? - Yuriy Faktorovich
你只是想将一个由10个数字组成的字符串格式化为电话号码吗?因为在C#中有更简单的方法可以做到这一点。 - Chris
@Yuriy - 删去问号简化了问题。 @Chris - 是的,我可以使用String.Format格式化电话号码。但我想知道是否有任何类型的掩码。有点学术 :) - macca1
1
你可能也想在第二个字符串文字周围加上双引号。 - Chris
3个回答

12

如果您想将某种格式应用于数字,可以尝试以下方法:

long number = 2221239876;
string result = number.ToString("(###) ### ####");    // Result: (222) 123 9876

有关更多信息,请参见.NET Framework文档中的自定义数字格式字符串


1
string one = "(999) 999-9999";
string two = "2221239876";

StringBuilder result = new StringBuilder();

int indexInTwo = 0;
for (int i = 0; i < one.Length; i++)
{
    char character = one[i];
    if (char.IsDigit(character))
    {
        if (indexInTwo < two.Length)
        {
            result.Append(two[indexInTwo]);
            indexInTwo++;
        }
        else
        {
            // ran out of characters in two
            // use default character or throw exception?
        }
    }
    else
    {
        result.Append(character);
    }
}

0

我不太确定您期望模式(字符串“one”)有多大的差异。如果它总是看起来像您展示的那样,也许您可以用“#”替换九,并使用.ToString(...)。

否则,您可能需要做一些类似于

        string one = "(9?99) 999-9999";
        string two = "2221239876";

        StringBuilder sb = new StringBuilder();
        int j = 0;
        for (int i = 0; i < one.Length; i++)
        {
            switch (one[i])
            {
                case '9': sb.Append(two[j++]);
                    break;
                case '?': /* Ignore */
                    break;
                default:
                    sb.Append(one[i]);
                    break;
            }
        }

显然,您应该检查以确保如果一个字符串比另一个字符串“更长”(即,“one”包含比“two”的长度更多的数字等),不会发生IndexOutOfRange异常。

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