c#更改字符串的格式

时间:2017-03-08 09:56:43

标签: c# string-formatting

编辑:

由于您的回答,我认为我提出的问题是错误的。

这不是我的解决方案不起作用或不是很干净。我很感兴趣,如果有一般的方法,你怎么能打破一个字符串。就像你可以使用int或其他数据类型一样。

所以我找不到一个。但我希望有一个。

这就是我想问的问题:

C#是否提供了一种格式化字符串的方法,就像它对int或其他数据类型一样?

我正在寻找类似的东西:

myString.Format(myFormat);

或:

myFormattedString = String.Format(myString, myFormat);

如果答案是否定的,那也没关系。我只是想知道它。 (也许还有其他人)


原始问题:

更改字符串格式的最佳方法是什么?

所以我有一个看起来像这样的字符串:

"123456789012345678"

现在我想要那个:

"12.34.567890.12345678"

我正在使用它,但我发现它不是很干净:

private string FormatString(string myString)
{
    return myString.Insert(2, ".").Insert(5, ".").Insert(12, ".");
}

我尝试过的事情:

// Too long.
private string FormatString(string myString)
{
    return myString.Substring(0, 2)
         + "."
         + myString.Substring(2, 2)
         + "."
         + myString.Substring(4, 6)
         + "."
         + myString.Substring(10, 8);
}

// Convertion from string -> long -> string.
private string FormatString(string myString)
{
    return String.Format("{0:##'.'##'.'######'.'########}", long.Parse(myString));
}

我正在寻找类似的东西:

private string FormatString(string myString)
{
    return String.Format("{0:##'.'##'.'######'.'########}", myString);
}

3 个答案:

答案 0 :(得分:4)

我没有看到您的代码有任何问题,但如果您想要更好的匹配系统,您可能需要考虑正则表达式:

(\d{2})(\d{2})(\d{6})(\d{8})

并将其替换为:

$1\.$2\.$3\.$4

In action

但我的两分钱:保持原状。

答案 1 :(得分:1)

嗯......当框架没有提供你想要的东西时,你总是可以自己做。

我已将此方法作为实验。它肯定可以优化并且没有经过全面测试,但它可以让您了解自己可以做些什么:

private string FormatString(string myString,string format)
{
    const char number = '#';
    const char character = '%';
    StringBuilder sb = new StringBuilder();

    if (format.Length < myString.Length) throw new Exception("Invalid format string");

    int i = 0;
    foreach (char c in format)
    {
        switch (c)
        {
            case number:
                if (char.IsDigit(myString[i]))
                {
                    sb.Append(myString[i]);
                    i++;
                }
                else
                {
                    throw new Exception("Format string doesn't match input string");
                }
                break;
            case character:
                if (!char.IsDigit(myString[i]))
                {
                    sb.Append(myString[i]);
                    i++;
                }
                else
                {
                    throw new Exception("Format string doesn't match input string");
                }
                break;
            default:
                sb.Append(c);
                break;
        }

    }
    return sb.ToString();
}

此方法要求格式字符串具有#来表示数字,%来表示字符,或任何其他字符将按字面复制到格式化字符串。

用法:

string test = FormatString("123456789012345678", "##.##.######.########");
//outputs 12.34.567890.12345678
string test = FormatString("12345F789012345678", "##.##.#%####.########");
//outputs 12.34.5F7890.12345678

答案 2 :(得分:0)

如果您的字符串始终是一个数字,那么您可以这样做:

string stringData = "123456789012345678";
string dataInFormat = Convert.ToInt64(stringData).ToString(@"##\.##\.######\.########");

首先将字符串转换为long,然后在其上实现格式。在你的情况下,它将是这样的:

private string FormatString(string myString)
{
    return Convert.ToInt64(myString).ToString(@"##\.##\.######\.########");
}