c#改变字符串的格式

Posted

技术标签:

【中文标题】c#改变字符串的格式【英文标题】:c# Change the format of a string 【发布时间】:2017-07-28 19:56:09 【问题描述】:

编辑:

由于您的回答,我认为我问错了问题。

并不是我的解决方案不起作用或不是很干净。如果有一种通用的方法,我对如何格式化字符串很感兴趣。就像您可以使用 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);

【问题讨论】:

“我正在使用它,但我觉得它不是很干净:”我认为它非常清晰,因为它很容易理解。跨度> 只是在输入与 HimBromBeere 相同的内容。这对我来说是非常明确的。我会保留它! 保留你所拥有的。真的很干净。 string.insert multiple values. Is this possible?的可能重复 我会颠倒Insert的顺序:myString.Insert(10, ".").Insert(4, ".").Insert(2, ".")。通过这种方式,更清楚您插入"." 的初始位置是什么...以您编写代码的方式,第二个Insert() 必须计算已经插入的第一个"." 【参考方案1】:

我看不出你的代码有什么问题,但是如果你想要一个更好的匹配系统,你可能需要考虑正则表达式:

(\d2)(\d2)(\d6)(\d8)

并将其替换为:

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

(In action)

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

【讨论】:

如果可以的话,我会 +2 那个指向 regex101 的链接.....为什么我从来不关注那个网站?看起来棒极了。 这让我想起了Jamie Zawinski 的一句话:有些人在遇到问题时会想“我知道,我会使用正则表达式”。现在他们有两个问题。 scnr ;) 轻笑,我明白你的意思!我喜欢将自己视为正则表达式专家,但从不超过一天:)【参考方案2】:

如果你的字符串总是一个数字,那么你可以这样做:

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

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

private string FormatString(string myString)

    return Convert.ToInt64(myString).ToString(@"##\.##\.######\.########");

【讨论】:

请参阅:“我尝试过的事情”。我不喜欢这种解决方案,因为您将字符串转换为 long,然后将 long 转换回字符串。期望框架非常好,并且不会在后台执行此操作。我不认为。【参考方案3】:

嗯……当框架不能提供你想要的东西时,你总是可以自己做。

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

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

【讨论】:

是的,这可行,但你知道,我真的很懒惰...... :) 但如果我正确解释你的答案,框架不支持字符串格式。那真的会很伤心。在 c# 之前,我使用 Pl/1,你有这个:link 好吧,我几乎不记得 Cobol 也有类似的东西。我不认为 C# 有这样的东西,顺便说一句,它是一种验证字符串的方法,而不是一种格式化它们的方法。使用这种方法你可以格式化和验证字符串。而且它已经完成了,所以即使是懒惰的你也可以使用它:) 不,它不仅仅是验证。但是参考有点烂。你可以更好地看到它:link。对于字母值,它是相同的。但我想我会在插入时使用我的变体。下一个必须理解或更改我的代码的人将不胜感激。感谢您的努力,也许它可以帮助其他需要格式化和验证的人。

以上是关于c#改变字符串的格式的主要内容,如果未能解决你的问题,请参考以下文章

解读C#编程中最容易忽略7种编写习惯!

如何将字符串转换为 12 位二进制而不改变它在 asp.net c# 中的值

C#中string和StringBuilder的区别

C# 格式化字符串

C#字符串格式[重复]

C#格式化字符串