字母数字字符串中所有数字的3位分组

时间:2015-04-30 11:28:48

标签: c# regex string

我发现迭代通过空格字符分割的字符串部分并提取数字部分并应用

效率不高
UInt64.Parse(Regex.Match(numericPart, @"\d+").Value)

并将它们连接在一起以形成包含数字的字符串。

是否有更好,更有效的方法3-digit对包含其他字符的字符串中的所有数字进行分组?

3 个答案:

答案 0 :(得分:3)

我非常确定最有效的方法(CPU方式,只需一次通过字符串)是基本的foreach循环,沿着这些行

var sb = new StringBuilder()
foreach(char c in inputString)
{
    // if c is a digit count
    // else reset counter
    // if there are three digits insert a "."
}
return sb.ToString()

这将产生123.456.7

如果你想要1.234.567,你需要一个额外的数字序列缓冲区

答案 1 :(得分:2)

所以你想要用相同的long来替换字符串中的所有long,但是使用当前文化的数字组分隔符? ......是的

string[] words = input.Split();
var newWords = words.Select(w => 
{
    long l;
    bool isLong = System.Int64.TryParse(w.Trim(), out l);
    if(isLong) 
        return l.ToString("N0");
    else
        return w;
});
string result = string.Join(" ", newWords);

根据您的评论输入:

string input = "hello 134443 in the 33 when 88763 then";

如果您当前的文化使用逗号作为数字组分隔符,则会得到预期结果:"hello 134,443 in the 33 when 88,763 then"

答案 2 :(得分:0)

我将发布基于正则表达式的示例。我相信正则表达式不一定太慢,特别是一旦编译并用staticreadonly声明。

// Declare the regex
private static readonly Regex regex = new Regex(@"(\d)(?=(\d{3})+(?!\d))", RegexOptions.Compiled); 
// Then, somewhere inside a method
var replacement = string.Format("$1{0}", System.Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberGroupSeparator);  // Get the system digit grouping separator
var strn = "Hello 34234456 where 3334 is it?"; // Just a sample string
// Somewhere (?:inside a loop)?
var res = regex.Replace(strn, replacement);

输出(如果,是系统数字分组分隔符):

Hello 34,234,456 where 3,334 is it?