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

C# 字母数字字符串中所有数字的3位分组,c#,regex,string,C#,Regex,String,我发现迭代按空格字符分割的字符串部分并提取数字部分并应用它是没有效率的 UInt64.Parse(Regex.Match(numericPart, @"\d+").Value) 然后将它们连接在一起,形成一个数字分组的字符串 有没有更好、更有效的方法来对包含其他字符的字符串中的所有数字进行分组?我敢肯定,最有效的方法(CPU方面,只需对字符串进行一次遍历)是基本的foreach循环,如下所示 var sb = new StringBuilder() foreach(char c in inpu

我发现迭代按空格字符分割的字符串部分并提取数字部分并应用它是没有效率的

UInt64.Parse(Regex.Match(numericPart, @"\d+").Value)
然后将它们连接在一起,形成一个数字分组的字符串


有没有更好、更有效的方法来对包含其他字符的字符串中的所有数字进行分组?

我敢肯定,最有效的方法(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,您将需要一个额外的数字序列缓冲区

我确信最有效的方法(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,则需要为数字序列添加一个额外的缓冲区

,以便使用相同的长度替换字符串中的所有长度,但使用当前区域性的数字组分隔符。。。。对

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 134443在33 when 88763中,然后”
,如果您当前的区域性使用逗号作为数字组分隔符。

那么您想用相同的长字符替换字符串中的所有长字符,但要使用当前区域性的数字组分隔符。。。。对

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 134443在33 when 88763中,然后”
,如果您当前的区域性使用逗号作为数字组分隔符。

我将发布基于正则表达式的示例。我相信正则表达式不必太慢,尤其是当它被编译并用
static
readonly
声明时

// 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);
输出(如果
是系统数字分组分隔符):


我将发布我的基于正则表达式的示例。我相信正则表达式不必太慢,尤其是当它被编译并用
static
readonly
声明时

// 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);
输出(如果
是系统数字分组分隔符):



你能展示一个输入和输出值的例子吗?@SonerGönül例如:输入:“Hello 34234456,3334在哪里?”输出“Hello 34234456,3334在哪里?”“所有数字的三位数分组”因此,如果字符串是
“ABC 12345 DEF”
,你想要一个结果
“123 45”
?@TimSchmelter如果没有空格分隔,则不会character@Farshid:再看一看我的评论。因此,您确实希望将三个连续的数字分组,并将其余的数字放在末尾?能否显示一个输入和输出值的示例?@SonerGönül例如:输入:“Hello 34234456,3334在哪里?”输出“Hello 34234456,3334在哪里?”“所有数字的三位数分组”因此,如果字符串是
“ABC 12345 DEF”
如果没有空格分隔,您希望得到结果
“123 45”
?@TimSchmeltercharacter@Farshid:再看一看我的评论。因此,你真的想把三个连续的数字分组,并把其余的数字放在末尾吗?我正在寻找一种有效的方法。正则表达式define efficient!您是指CPU周期、源代码中的字符数还是理解源代码的分钟数?要获得1.234.567,您可以使用反向for循环,而不是额外的缓冲区。for循环的索引与需要插入点的位置匹配,并且插入不会影响较低索引的位置。正则表达式define efficient!您是指CPU周期、源代码中的字符数还是理解源代码的分钟数?要获得1.234.567,您可以使用反向for循环,而不是额外的缓冲区。for循环的索引与需要插入点的位置相匹配,并且插入不会影响较低索引的位置。这将破坏多空格、换行符和制表符间距,但除此之外:一切正常@科赫博士:是的,会的。因此,要么它不包含它们,要么如果结果不再包含它们,那么它是需要的/不重要的。如果OP只想在空格上拆分,他可以使用
input.split(“”)
。但它不会破坏多个空格,因为我没有使用
removeMptyEntries
。这将破坏多个空格、换行符和制表符间距,但除此之外:一切正常@科赫博士:是的,会的。因此,要么它不包含它们,要么如果结果不再包含它们,那么它是需要的/不重要的。如果OP只想在空格上拆分,他可以使用
input.split(“”)
。但它不会破坏多个空间,因为我没有使用
removeMptyEntries
。您认为这种方法怎么样?实际上只有3行。正则表达式有点难读,它的意思是“匹配任何数字,后面跟任意数量的3位数字组,直到找到一个非数字”,我们用数字和数字分组分隔符替换这个数字。但是它应该是快速的,因为它被编译并声明为一个静态只读字段?实际上只有3行。正则表达式有点难读,它的意思是“匹配任何数字,后面跟任意数量的3位数字组,直到找到一个非数字”,我们用数字和数字分组分隔符替换这个数字。但它应该是快速的,因为它被编译并声明为静态只读字段。