【问题标题】:c# Change the format of a stringc#改变字符串的格式
【发布时间】: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 相同的内容。这对我来说是非常明确的。我会保留它!
  • 保留你所拥有的。真的很干净。
  • 我会颠倒Insert的顺序:myString.Insert(10, ".").Insert(4, ".").Insert(2, ".")。通过这种方式,更清楚您插入"." 的初始位置是什么...以您编写代码的方式,第二个Insert() 必须计算已经插入的第一个"."

标签: c# string-formatting


【解决方案1】:

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

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

并将其替换为:

$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。对于字母值,它是相同的。但我想我会在插入时使用我的变体。下一个必须理解或更改我的代码的人将不胜感激。感谢您的努力,也许它可以帮助其他需要格式化和验证的人。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-09
  • 2016-10-05
相关资源
最近更新 更多