c#中一种将数字不规则地分割成许多部分的模式

本文关键字:分割 许多部 模式 不规则 数字 一种 | 更新日期: 2023-09-27 18:15:36

每当我得到一个11位数的数字(如12345678901,82344678971等),我想把它分成4部分,总是5digits-4digits-1digit-1digit。所以:
12345678901 -> 12345678901
82344674971 -> 82344674971

我看到一个类似的问题在SOF,但它使用常规块;即相同数量的数字:分割字符串/数字每n个字符/数字?

我想要一个函数,它将接受任何11位(长)整数作为参数,并将以上述方式返回;从那里我可以得到任何块,我想:例如,SplitInParts(1)将返回12345;SplitInParts(2)将返回6789;SplitInParts(3)将返回0;SplitInParts(4)将返回1。类似地,82344674971:82344,6749,7,1。

作为c#的新手,我无法通过c#实现上述功能。

c#中一种将数字不规则地分割成许多部分的模式

这是一个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];
    }
}

如果是整数,则可以使用以下命令将其十进制数取出:

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。连接(框架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

在字符数组上使用Enumerable的Take和Skip扩展方法

这里有几个选项:

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) 
});

这取决于您希望如何处理小于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;
}