Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将数字分成3位数的组_C#_Parsing - Fatal编程技术网

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();
}