将数字拆分为3位数的组

Blu*_*ire 2 c# parsing

我想使该取类型的变量的方法intlong与返回的数组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
Run Code Online (Sandbox Code Playgroud)

我知道如何使用模运算符获取数字的最后n位数,但我不知道如何获得 n位数,这是我能想到的唯一方法.请帮忙!

dri*_*iis 5

不转换为字符串:

int[] splitNumber(int value)
{ 
    Stack<int> q = new Stack<int>();
    do 
    {
        q.Push(value%1000);
        value /= 1000;
    } while (value>0);
    return q.ToArray();
}
Run Code Online (Sandbox Code Playgroud)

这是简单的整数运算; 首先取模数得到最右边的小数,然后除去你已经添加的小数.我使用Stack来避免反转列表.

编辑:在评论中建议使用日志来获取长度.它可以使代码稍微缩短,但在我看来,这不是更好的代码,因为在阅读它时意图不太明确.此外,由于额外的Math函数调用,它可能性能较差.无论如何; 这里是:

int[] splitNumber(int value)
{
    int length = (int) (1 + Math.Log(value, 1000));
    var result = from n in Enumerable.Range(1,length)
                 select ((int)(value / Math.Pow(1000,length-n))) % 1000;
    return result.ToArray();           
}
Run Code Online (Sandbox Code Playgroud)


Dot*_*ser 5

通过转换为字符串,然后转换为 int 数组

int number = 1000000;
string parts = number.ToString("N0", new NumberFormatInfo()
                                            {
                                                NumberGroupSizes = new[] { 3 },
                                                NumberGroupSeparator = "."
                                            });
Run Code Online (Sandbox Code Playgroud)

通过使用数学,

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;
}
Run Code Online (Sandbox Code Playgroud)