C# 将数字分成3位数的组
我想制作一个方法,它接受一个类型为C# 将数字分成3位数的组,c#,parsing,C#,Parsing,我想制作一个方法,它接受一个类型为int或long的变量,并返回一个ints或longs的数组,每个数组项由3位数字组成。例如: int[] i = splitNumber(100000); // Outputs { 100, 000 } int[] j = splitNumber(12345); // Outputs { 12, 345 } int[] k = splitNumber(12345678); // Outputs { 12, 345, 678 } // Et cetera
int
或long
的变量,并返回一个int
s或long
s的数组,每个数组项由3位数字组成。例如:
int[] i = splitNumber(100000);
// Outputs { 100, 000 }
int[] j = splitNumber(12345);
// Outputs { 12, 345 }
int[] k = splitNumber(12345678);
// Outputs { 12, 345, 678 }
// Et cetera
我知道如何使用模运算得到一个数的最后n位,但我不知道如何得到前n位,这是我能想到的唯一方法。救命啊 首先尝试将其转换为字符串,然后进行解析,然后再次将其转换回数字转换为字符串 获取长度 如果长度模数3==0 每3个字符串将其子串成整数 否则如果 找到剩余的部分,例如剩余的一个或两个 从字符串前面删除子字符串余数
然后,在不转换为字符串的情况下,将其余部分的子字符串改为3:
int[] splitNumber(int value)
{
Stack<int> q = new Stack<int>();
do
{
q.Push(value%1000);
value /= 1000;
} while (value>0);
return q.ToArray();
}
您可以先找出数字的大小,然后使用除法获得第一个数字,然后使用模保留其余数字:
int number = 12345678;
int len = 1;
int div = 1;
while (number >= div * 1000) {
len++;
div *= 1000;
}
int[] result = new int[len];
for (int i = 0; i < result.Length; i++) {
result[i] = number / div;
number %= div;
div /= 1000;
}
int number=12345678;
int len=1;
int div=1;
而(数字>=div*1000){
len++;
div*=1000;
}
int[]结果=新的int[len];
for(int i=0;i
通过转换为字符串,然后转换为int数组
int number = 1000000;
string parts = number.ToString("N0", new NumberFormatInfo()
{
NumberGroupSizes = new[] { 3 },
NumberGroupSeparator = "."
});
通过运用数学
public static int[] splitNumberIntoGroupOfDigits(int number)
{
var numberOfDigits = Math.Floor(Math.Log10(number) + 1); // compute number of digits
var intArray = new int[Convert.ToInt32(numberOfDigits / 3)]; // we know the size of array
var lastIndex = intArray.Length -1; // start filling array from the end
while (number != 0)
{
var lastSet = number % 1000;
number = number / 1000;
if (lastSet == 0)
{
intArray[lastIndex] = 0; // set of zeros
--lastIndex;
}
else if (number == 0)
{
intArray[lastIndex] = lastSet; // this could be your last set
--lastIndex;
}
else
{
intArray[lastIndex] = lastSet;
--lastIndex;
}
}
return intArray;
}
您可以将其用于.NET 3.5及更高版本中的
System.Linq
命名空间:
int[] splitNumber(long value)
{
LinkedList<int> results = new LinkedList<int>();
do
{
int current = (int) (value % 1000);
results.AddFirst(current);
value /= 1000;
} while (value > 0);
return results.ToArray();// Extension method
}
这是如何回答OP的问题的?非常有趣,但是我想(如果可能的话)使用一种不经过转换的方法,因为最初的问题是关于将一个数字分成若干组;然而,我想看看是否有一种不需要转换的方法。而且,不需要列表。你可以计算三人组的数量(我认为是使用log)。是的,你可以这样做,在我看来,这更干净,几乎没有开销。注意,这只适用于正整数,我怀疑这对于OP的用例来说是好的。当我试着编译它时,它说
System.Collections.Generic.LinkedList不包含“ToArray”的定义。
。Bluefire,你能将你的“用法”复制并粘贴到页面顶部吗?@Bluefire:我已经更新了我的答案以解决你的编译错误。很好!我将你的方法与其他方法的性能进行了基准测试,超过1亿次调用,而你的方法是最好的。
int[] splitNumber(long value)
{
LinkedList<int> results = new LinkedList<int>();
do
{
int current = (int) (value % 1000);
results.AddFirst(current);
value /= 1000;
} while (value > 0);
return results.ToArray();// Extension method
}
int[] splitNumber(long value)
{
Stack<int> results = new Stack<int>();
do
{
int current = (int) (value % 1000);
results.Push(current);
value /= 1000;
} while (value > 0);
return results.ToArray();
}