如何获取 int 中的数字计数以及如何在不创建字符串的情况下拆分数字

How to get count of numbers in int and how to split a number without making a string

我有一个像 601511616 这样的号码 如果所有数字的长度都是 3 的倍数,如何将数字拆分为数组 而无需创建字符串

此外,如何在不创建字符串的情况下计算 int 中的数字?

编辑:有没有办法简单地分割数字,知道它总是 3 的倍数...好的输出应该是这样的:{616,511,601}

我无法理解您关于如何在不创建字符串的情况下将数字拆分为数组的问题 - 抱歉。但是我可以理解有关获取 int 中数字计数的问题。

这是您对该问题的回答。

Math.Floor(Math.Log10(601511616) + 1) = 9

编辑: 这是您第一个问题的答案..

            var n = 601511616;
            var nArray = new int[3];
            for (int i = 0, numMod = n; i < 3; numMod /= 1000, i++)
                nArray[i] = numMod%1000;

请记住,此操作不安全。

编辑#3

仍然不完美,但是一个更好的例子。

    var n = 601511616;
    var nLength = (int)Math.Floor(Math.Log10(n) + 1)/ 3;
    var nArray = new int[nLength];
    for (int i = 0, numMod = n; i < nLength; numMod /= 1000, i++)
        nArray[i] = numMod%1000;

编辑#3:

IDE一个例子http://ideone.com/SSz3Ni

输出与发帖人建议的编辑一致。

{ 616, 511, 601 }

您可以使用i % 10来获取整数的最后一位。
然后,您可以使用除以 10 来删除最后一位数字。

1234567 % 10 = 7  
1234567 / 10 = 123456

这是代码示例:

int value = 601511616;
List<int> digits = new List<int>();

while (value > 0) 
{
    digits.Add(value % 10);
    value /= 10;
}

// digits is [6,1,6,1,1,5,1,0,6] now

digits.Reverse(); // Values has been inserted from least significant to the most

// digits is [6,0,1,5,1,1,6,1,6] now

Console.WriteLine("Count of digits: {0}", digits.Count); // Outputs "9"

for (int i = 0; i < digits.Count; i++) // Outputs "601,511,616"
{
    Console.Write("{0}", digits[i]); 
    if (i > 0 && i % 3 == 0) Console.Write(","); // Insert comma after every 3 digits
}

IDEOne working demonstration of List and division approach.

其实如果不需要拆分,只需要3位一组输出,那么有一个很方便的方法就是格式化。
它也会起作用:)

int value = 601511616;
Console.WriteLine("{0:N0}", value); // 601,511,616
Console.WriteLine("{0:N2}", value); // 601,511,616.00

IDEOne working demonstration of formatting approach.

使用Log10计算位数很容易,但涉及浮点运算,速度很慢,有时会因舍入误差而出错。您可以使用这种方式而无需先计算值大小。不关心位数是不是3的倍数

int value = 601511616;

List<int> list = new List<int>();

while (value > 0) // main part to split the number
{
    int t = value % 1000;
    value /= 1000;
    list.Add(t);
}

// Convert back to an array only if it's necessary, otherwise use List<T> directly
int[] splitted = list.ToArray();

这会将拆分后的数字倒序存储,即601511616将变为{616, 511, 601}。如果您想要原始顺序的数字,只需向后迭代数组即可。或者使用 Array.ReverseStack

因为你已经知道它们是 3 的倍数,你可以只使用提取每个数字的方法,但使用 1000 而不是 10。这是示例

a = 601511616
b = []

while(a):
    b.append(a%1000)
    a = a//1000

print(b)
#[616, 511, 601]