C# 什么';格式化以下字符串的最有效方法是什么?
我有一个非常简单的问题,我不应该被挂断,但我是。哈哈 我收到以下格式的字符串: 123 123456-D53 123455-4D 234234-4 123415 所需的输出(后期格式化)为: 123-455-444 123-455-55 123-455-5 或 123-455 格式最终取决于原始字符串中的字符总数 我有几个想法如何做到这一点,但我保留的东西有一个更好的方式比字符串。替换和连接 谢谢你的建议 Ian编辑:查看旧版本的历史记录。C# 什么';格式化以下字符串的最有效方法是什么?,c#,string,formatting,C#,String,Formatting,我有一个非常简单的问题,我不应该被挂断,但我是。哈哈 我收到以下格式的字符串: 123 123456-D53 123455-4D 234234-4 123415 所需的输出(后期格式化)为: 123-455-444 123-455-55 123-455-5 或 123-455 格式最终取决于原始字符串中的字符总数 我有几个想法如何做到这一点,但我保留的东西有一个更好的方式比字符串。替换和连接 谢谢你的建议 Ian编辑:查看旧版本的历史记录。 只能用于查找数字 var output = new S
只能用于查找数字
var output = new StringBuilder();
var digitCount = 0;
foreach( var c in input )
{
if( char.IsDigit( c ) )
{
output.Append( c );
digitCount++;
if( digitCount % 3 == 0 )
{
output.Append( "-" );
}
}
}
// Remove possible last -
return output.ToString().TrimEnd('-');
这个代码应该从左到右填充(现在我知道了,先读,然后编码)…很抱歉,我现在仍然无法测试这一点。我假设这不仅仅依赖于始终是数字的输入?如果是这样的话,我正在考虑这样的事情
private string ApplyCustomFormat(string input)
{
StringBuilder builder = new StringBuilder(input.Replace("-", ""));
int index = 3;
while (index < builder.Length)
{
builder.Insert(index, "-");
index += 4;
}
return builder.ToString();
}
私有字符串ApplyCustomFormat(字符串输入)
{
StringBuilder=新的StringBuilder(输入。替换(“-”,”);
int指数=3;
while(索引
Tanascius是对的,但我不能评论或投票,因为我没有代表,但如果你想了解字符串格式的更多信息,我觉得这很有帮助。
不是最快的,但是很容易看(ed:to read):
字符串规格化(字符串值)
{
if(String.IsNullOrEmpty(value))返回值;
int=0;
var builder=新的StringBuilder(value.Length+value.Length/3);
对于(int ii=0;ii
使用猜测预分配
StringBuilder
的长度。这将接受任何字母数字输入以及用户添加的任意数量的垃圾,包括多余的空格。这里有一个方法,它使用正则表达式和LINQ的组合一次提取三个字母组,然后再次将它们连接在一起。注意:它假设输入已经过验证。也可以使用正则表达式进行验证
string s = "123456-D53";
string[] groups = Regex.Matches(s, @"\w{1,3}")
.Cast<Match>()
.Select(match => match.Value)
.ToArray();
string result = string.Join("-", groups);
string s=“123456-D53”;
string[]groups=Regex.Matches(s,@“\w{1,3}”)
.Cast()
.Select(匹配=>match.Value)
.ToArray();
字符串结果=string.Join(“-”,组);
结果:
123-456-D53
123-456-D53
你确定效率是这里最重要的指标,而不是可读性吗?您是否分析过这是您计划中的瓶颈?两个帐户都没有。事实上,我确信这不是瓶颈,效率也不是最重要的指标。我只是好奇,整天都在想这件事。:)我想澄清一下我原来的帖子,字符串可以是字母数字,而不仅仅是数字。我想这会把数字填错方向。可以说,他想让它左对齐。@Ian:我现在用char.IsDigit@sixlettervariables:你是对的,这让它变得更加困难。@Ian:现在我的解决方案是删除字母。。。希望您想要这个,因为您的问题不清楚(所有输出都有数字),我不在最新的.Net上,所以这可能已被更改,但不应该用
==“-”
替换==“-”
?这与我的实现类似。。我刚刚被问到“这是做这件事最有效的方法吗?”这个问题。@Ian P--“最有效”不如“足够有效”。见第一条评论。我很想编写使用IEnumerable chunker(方法或正则表达式)和String.Join;-)的“效率较低”的代码选择这个作为答案,因为它首先按照我描述的规范工作。尽管如此,其他海报也按照要求更新了代码。所有的都是绿色的复选标记,但我只能给出一个:)哈哈,我们必须有不同类型的眼睛:pYou应该检查(ii+1)%3==0
@0xA3:good catch@pst:如果我回来读这篇文章,很明显发生了什么。没有混淆;)您更新了代码,但仍然是错误的;-)所以要么检查((builder.Length+1)%4)==0
,要么检查((ii+1)%3==0)
。我应该告诉你我删除了我的答案:-)。OP改变了问题,不再适用。此外,SixlettVariable指出,它实际上也没有回答原来的问题。
123-456-D53