簡體   English   中英

在C#中將數字的圖案不規則分割成其數字的許多部分?

[英]A patterned irregular splitting of a number into many parts of its digits in C#?

每當給出一個11位數字(如12345678901,82344678971等)時,我想將它分成4個部分,總是為5digits-4digits-1digit-1digit。 所以:
12345678901 - > 12345 6789 0 1
82344674971 - > 82344 6749 7 1

我在SOF中看到了類似的問題,但是它使用常規塊; 即相同的位數: 每第N個字符/數字拆分一個字符串/數字?

我想要一個函數,它將任何11位(長整數)作為參數,並將以上述方式返回; 從哪里我可以得到我想要的任何塊:例如,SplitInParts(1)將返回12345; SplitInParts(2)將返回6789; SplitInParts(3)將返回0; SplitInParts(4)將返回1.類似地,分別為82344674971:82344,6749,7,1。

作為C#的新手,我無法通過C#實現上述功能。

如果你有一個整數,你可以使用類似的東西得到十進制數字:

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()的解決方案慢一點(雖然更有趣number.ToString() ,所以如果你只需要格式,那就去吧。 如果您確實需要數字本身,請使用此選項。

這是一個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];
    }
}

在字符數組上使用Enumerable的Take和Skip擴展方法

在我使用substring的地方使用此函數。

 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”作為要提取的部分的數量。 我希望這就是你所要求的如果你想要,那么你可以將返回的字符串轉換為整數

以下是一些選項:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM