我发现迭代通过空格字符分割的字符串部分并提取数字部分并应用
效率不高UInt64.Parse(Regex.Match(numericPart, @"\d+").Value)
并将它们连接在一起以形成包含数字的字符串。
是否有更好,更有效的方法3-digit
对包含其他字符的字符串中的所有数字进行分组?
答案 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)
我将发布基于正则表达式的示例。我相信正则表达式不一定太慢,特别是一旦编译并用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);
输出(如果,
是系统数字分组分隔符):
Hello 34,234,456 where 3,334 is it?