一个数字在C#中被不规则地分割成许多部分的图案?

一个数字在C#中被不规则地分割成许多部分的图案?,c#,substring,C#,Substring,每当我得到一个11位数字(如1234567801、82344678971等),我总是想把它分成4部分,作为5位数字-4位数字-1位数字-1位数字。所以: 12345678901->12345678901 82344674971->82344 6749 7 1 我在SOF中看到了一个类似的问题,但它使用常规块;即相同位数: 我想要一个函数,将采取任何11位(长)整数作为参数,并将返回上述方式;从那里我可以得到我想要的任何块:例如,SplitInParts(1)将返回12345;SplitInPar

每当我得到一个11位数字(如1234567801、82344678971等),我总是想把它分成4部分,作为5位数字-4位数字-1位数字-1位数字。所以:
12345678901->12345678901
82344674971->82344 6749 7 1

我在SOF中看到了一个类似的问题,但它使用常规块;即相同位数:

我想要一个函数,将采取任何11位(长)整数作为参数,并将返回上述方式;从那里我可以得到我想要的任何块:例如,SplitInParts(1)将返回12345;SplitInParts(2)将返回6789;SplitInParts(3)将返回0;SplitInParts(4)将返回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;
}

此解决方案比仅使用
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";
     }
  }
使用“值”作为要拆分的原始值,使用“拆分零件”作为要提取的零件编号。我希望这就是你要问的
如果需要,可以将返回的字符串转换为整数。以下是一些选项:

string id = 82344678971.ToString();

string parsed = Regex.Replace(id, @"(\d{5})(\d{4})(\d{1})(\d{1})", @"$1 $2 $3 $4");
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位
int
s不存在。你可能想要一个
长的
,或者
字符串
@emperueraiman,我很清楚这一点;这就是为什么我在问题中指定了“(long)”作为整数类型。@ap,我更喜欢带有“performance”的解决方案,因为我以后会将上面的解决方案嵌入到一个非常复杂的作业中。但是,目前,我对“任何”解决方案都很感兴趣,因为我对C#非常陌生。我尝试了你的代码,它解决了。你介绍的代码很容易理解。非常感谢。
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;
}