我想创建一个方法,该方法接受int
或long
类型的变量,并返回int
或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个数字,这是唯一的方法来制作我能想到的这种方法。求救!
答案 0 :(得分:5)
不转换为字符串:
int[] splitNumber(int value)
{
Stack<int> q = new Stack<int>();
do
{
q.Push(value%1000);
value /= 1000;
} while (value>0);
return q.ToArray();
}
这是简单的整数运算;首先取模数得到最右边的小数,然后除去你已经添加的小数。我使用堆栈来避免反转列表。
编辑:在评论中建议使用日志来获取长度。这可能会产生稍微更短的代码,但在我看来,它不是更好的代码,因为在阅读它时意图不太明确。此外,由于额外的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();
}
答案 1 :(得分:4)
首先尝试将其转换为字符串并进行解析然后再将其转换回数字
答案 2 :(得分:4)
通过转换为字符串然后转换为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;
}
答案 3 :(得分:1)
转换为字符串
获取长度
如果长度模数3 == 0
String将其子串入每3个整数
否则如果 找到剩余的,比如剩下的一两个
字符串前面的子串余数
然后为其余的
子串3答案 4 :(得分:1)
你可以先找出这个数字有多大,然后使用除法得到第一个数字,然后用模数来保留其余数字:
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;
}
答案 5 :(得分:1)
您可以将其与.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
}
我使用LinkedList<int>
来避免在返回之前必须Reverse
列表。您也可以将Stack<int>
用于同一目的,这只需要.NET 2.0:
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();
}