在 C# 中,将数字有规律地不规则地拆分成其数字的许多部分?
A patterned irregular splitting of a number into many parts of its digits in C#?
每当我得到一个 11 位数字(如 12345678901、82344678971 等)时,我总是想将它分成 4 个部分,即 5digits-4digits-1digits-1digit。所以:
12345678901 -> 12345 6789 0 1
82344674971 -> 82344 6749 7 1
我在 SOF 中看到了类似的问题,但它使用的是常规块;即位数相同:Splitting a string / number every Nth Character / Number?
我想要一个将任何 11 位(长)整数作为参数的函数,并且将 return 与上述方式相同;从那里我可以获得我想要的任何块:例如,SplitInParts(1) 将 return 12345; SplitInParts(2) 将 return 6789; SplitInParts(3) 将 return 0; SplitInParts(4) 将 return 1。类似地,对于 82344674971:分别为 82344、6749、7、1。
作为C#的新手,我无法实现如何通过C#执行上述操作。
在字符数组上使用 Enumerable 的 Take 和 Skip 扩展方法
如果你有一个整数,你可以使用类似的东西得到小数位:
List<int> GetDigits(long number){
var result = new List<int>();
while (number != 0){
result.Insert(0, (int)(number %10));
number /=10;
}
return result;
}
这使用重复除法和模 10 将奇异数字变成 List<int>
现在,您可以通过多种方式获取格式化字符串,例如并在其上使用 string.Join(框架 4.5 及更高版本),例如:
var digits = GetDigits(12345678901);
var part1 = string.Join("",digits.Take(5));
var part2 = string.Join("",digits.Skip(5).Take(4));
var part3 = string.Join("",digits.Skip(9).Take(1));
var part4 = string.Join("",digits.Skip(10).Take(1));
此解决方案比仅使用 number.ToString()
的解决方案稍慢(尽管更有趣),因此如果您只需要格式,请使用它。如果您确实需要数字本身,请使用它。
在我使用子字符串的地方使用这个函数。
private string getMySubString(long value, int splitPart)
{
string str = value.ToString();
if (str.Length != 11) return "invalid number lenght";
string sub1 = str.Substring(0, 5);
string sub2 = str.Substring(5, 4);
string sub3 = str.Substring(9, 1);
string sub4 = str.Substring(10, 1);
switch (splitPart)
{
case 1:
return sub1;
case 2:
return sub2;
case 3:
return sub3;
case 4:
return sub4;
default:
return "Invalid part number";
}
}
使用"value"作为你想要拆分的原始值,使用"splitPart"作为你想要提取的部分的数量。我希望这就是你要问的
如果需要,则可以将返回的字符串转换为 Integer
这里有几个选项:
string id = 82344678971.ToString();
string parsed = Regex.Replace(id, @"(\d{5})(\d{4})(\d{1})(\d{1})", @" ");
string parsed2 = String.Join(" ", new string[] {
id.Substring(0, 5),
id.Substring(5, 4),
id.Substring(9, 1),
id.Substring(10, 1)
});
char[] chars = id.ToCharArray();
string parsed3 = String.Join(" ", new string[] {
new String(chars, 0, 5),
new String(chars, 5, 4),
new String(chars, 9, 1),
new String(chars, 10, 1)
});
这是 long 的扩展方法,其工作方式与您提供的示例类似,我认为它的可读性很强,尽管它的性能可能不如其他解决方案。
public static class LongExtensions
{
public static int SplitIntoIrregularParts(this long longNumber, int partIndexToReturn)
{
int[] blocks = string.Format("{0:##### #### # #}", longNumber).Split(' ').Select(x => int.Parse(x)).ToArray();
return blocks[partIndexToReturn];
}
}
根据您希望如何处理短于 11 位的数字,这可能是一个可靠的选择。它处理任意数量的数字,如果可能的话添加空格。
但是如果你只需要它在位数小于 11 时失败,你可以使用更简单的东西。
var t = InsertGaps(12345678912);
private string InsertGaps(long value)
{
var result = value.ToString();
result = InsertGap(result, 5);
result = InsertGap(result, 10);
result = InsertGap(result, 12);
return result;
}
private string InsertGap(string value, int index)
{
if (value.Length > index)
{
return value.Insert(index, " ");
}
return value;
}
每当我得到一个 11 位数字(如 12345678901、82344678971 等)时,我总是想将它分成 4 个部分,即 5digits-4digits-1digits-1digit。所以:
12345678901 -> 12345 6789 0 1
82344674971 -> 82344 6749 7 1
我在 SOF 中看到了类似的问题,但它使用的是常规块;即位数相同:Splitting a string / number every Nth Character / Number?
我想要一个将任何 11 位(长)整数作为参数的函数,并且将 return 与上述方式相同;从那里我可以获得我想要的任何块:例如,SplitInParts(1) 将 return 12345; SplitInParts(2) 将 return 6789; SplitInParts(3) 将 return 0; SplitInParts(4) 将 return 1。类似地,对于 82344674971:分别为 82344、6749、7、1。
作为C#的新手,我无法实现如何通过C#执行上述操作。
在字符数组上使用 Enumerable 的 Take 和 Skip 扩展方法
如果你有一个整数,你可以使用类似的东西得到小数位:
List<int> GetDigits(long number){
var result = new List<int>();
while (number != 0){
result.Insert(0, (int)(number %10));
number /=10;
}
return result;
}
这使用重复除法和模 10 将奇异数字变成 List<int>
现在,您可以通过多种方式获取格式化字符串,例如并在其上使用 string.Join(框架 4.5 及更高版本),例如:
var digits = GetDigits(12345678901);
var part1 = string.Join("",digits.Take(5));
var part2 = string.Join("",digits.Skip(5).Take(4));
var part3 = string.Join("",digits.Skip(9).Take(1));
var part4 = string.Join("",digits.Skip(10).Take(1));
此解决方案比仅使用 number.ToString()
的解决方案稍慢(尽管更有趣),因此如果您只需要格式,请使用它。如果您确实需要数字本身,请使用它。
在我使用子字符串的地方使用这个函数。
private string getMySubString(long value, int splitPart)
{
string str = value.ToString();
if (str.Length != 11) return "invalid number lenght";
string sub1 = str.Substring(0, 5);
string sub2 = str.Substring(5, 4);
string sub3 = str.Substring(9, 1);
string sub4 = str.Substring(10, 1);
switch (splitPart)
{
case 1:
return sub1;
case 2:
return sub2;
case 3:
return sub3;
case 4:
return sub4;
default:
return "Invalid part number";
}
}
使用"value"作为你想要拆分的原始值,使用"splitPart"作为你想要提取的部分的数量。我希望这就是你要问的 如果需要,则可以将返回的字符串转换为 Integer
这里有几个选项:
string id = 82344678971.ToString();
string parsed = Regex.Replace(id, @"(\d{5})(\d{4})(\d{1})(\d{1})", @" ");
string parsed2 = String.Join(" ", new string[] {
id.Substring(0, 5),
id.Substring(5, 4),
id.Substring(9, 1),
id.Substring(10, 1)
});
char[] chars = id.ToCharArray();
string parsed3 = String.Join(" ", new string[] {
new String(chars, 0, 5),
new String(chars, 5, 4),
new String(chars, 9, 1),
new String(chars, 10, 1)
});
这是 long 的扩展方法,其工作方式与您提供的示例类似,我认为它的可读性很强,尽管它的性能可能不如其他解决方案。
public static class LongExtensions
{
public static int SplitIntoIrregularParts(this long longNumber, int partIndexToReturn)
{
int[] blocks = string.Format("{0:##### #### # #}", longNumber).Split(' ').Select(x => int.Parse(x)).ToArray();
return blocks[partIndexToReturn];
}
}
根据您希望如何处理短于 11 位的数字,这可能是一个可靠的选择。它处理任意数量的数字,如果可能的话添加空格。
但是如果你只需要它在位数小于 11 时失败,你可以使用更简单的东西。
var t = InsertGaps(12345678912);
private string InsertGaps(long value)
{
var result = value.ToString();
result = InsertGap(result, 5);
result = InsertGap(result, 10);
result = InsertGap(result, 12);
return result;
}
private string InsertGap(string value, int index)
{
if (value.Length > index)
{
return value.Insert(index, " ");
}
return value;
}