C#字符串格式化
Posted 灰色淡季
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#字符串格式化相关的知识,希望对你有一定的参考价值。
c#改变字符串的格式
【中文标题】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#字符串格式化的主要内容,如果未能解决你的问题,请参考以下文章