【问题标题】:A patterned irregular splitting of a number into many parts of its digits in C#?在 C# 中将数字的图案化不规则拆分为其数字的许多部分?
【发布时间】:2015-09-30 22:00:23
【问题描述】:

每当我得到一个 11 位数字(如 12345678901、82344678971 等)时,我总是想将其分成 4 个部分,即 5digits-4digits-1digit-1digit。所以:
12345678901 -> 12345 6789 0 1
82344674971 -> 82344 6749 7 1

我在 SOF 中看到了一个类似的问题,但它使用常规块;即相同位数:Splitting a string / number every Nth Character / Number?

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

作为 C# 的新手,我无法通过 C# 实现上述操作。

【问题讨论】:

  • 你可以查找函数Substring
  • 它们存储在什么类型中?您是否关心性能而不是可读性?
  • 11 位数字 ints 不存在。您可能想要longstring
  • @EmpereurAiman,我很清楚这一点;这就是为什么我在问题中将整数类型指定为“(long)”。
  • @ap,我更喜欢具有“性能”的解决方案,因为我稍后会将上面的解决方案嵌入到非常复杂的工作中。但是,目前,由于我对 C# 非常陌生,因此我有一种“任何”解决方案的心情。

标签: c# substring


【解决方案1】:

这是一种长期扩展方法,其工作方式与您提供的示例类似,我认为它的可读性很强,尽管它的性能可能不如其他解决方案。

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

【讨论】:

    【解决方案2】:

    如果你有一个整数,你可以使用类似的方法得到十进制数字:

    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&lt;int&gt;

    现在,您可以通过多种方式获取格式化字符串,例如并在它们上使用 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() 的解决方案慢一点(尽管更有趣),所以如果你只需要这种格式,那就去吧。如果您确实需要数字本身,请使用此选项。

    【讨论】:

      【解决方案3】:

      在我使用子字符串的地方使用这个函数。

       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

      【讨论】:

      • 我试过你的代码,它解决了。您提供的代码非常易于遵循。非常感谢。
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        这里有几个选项:

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

        【讨论】:

          【解决方案6】:

          根据您希望如何处理少于 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;
          }
          

          【讨论】:

            猜你喜欢
            • 2011-05-11
            • 1970-01-01
            • 1970-01-01
            • 2016-01-18
            • 2011-10-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多