как разбить число на три части

Есть нумерация которая состоит из номера+месяц+год то-есть 1062020, необходимо отобразить вот так 1/06/2020, номер може быть и такой вот 10000/06/2020


Ответы (4 шт):

Автор решения: return
// default value: `1/00/0000`
public readonly struct DocumentNumber : IEquitable<DocumentNumer>
{
    readonly int numIndex;
    readonly int date;

    public int Number => numIndex + 1;
    public int Year => date & 0x3fff; // 1..14 bits
    public int Month => date >> 14; // 15..18 bits
    public DateTime Date => new DateTime(Year, Month, 0);

    public DocumentNumber(int number, DateTime date)
    {
        if (number < 1) /*throw*/;

        numIndex = number - 1;
        this.date = (date.Month << 14) | date.Year;
    }

    // ...

    public override string ToString() => $"{Number}/{Month:D2}/{Year:D4}";
    public static bool TryParse(ReadOnlySpan<char> buffer, out DocumentNumber number)
    {
        number = default;

        if (buffer.Length < 9) return false;
        if (buffer[^5] != '/' ||
            buffer[^8] != '/') return false;

        if (!int.TryParse(buffer[^4..^0], out var year)) return false;
        if (!int.TryParse(buffer[^7..^5], out var month)) return false;
        if (!int.TryParse(buffer[..^8], out var num)) return false;

        number = new DocumentNumber(num, new DateTime(year, month, 1));

        return true;
    }

    // ...
}

Если сделать поле date публичным:

static void Main()
{
    var docNum = new DocumentNumber(3, DateTime.Now);

    // binary view
    var date = docNum.date;

    for (var i = 0; i < 4; i++)
        Console.Write((((date << i) & 0x20000) >> 17) != 0 ? '1' : '0');

    Console.Write(' ');

    for (var i = 0; i < 14; i++)
        Console.Write((((date << i) & 0x2000) >> 13) != 0 ? '1' : '0');
}
→ Ссылка
Автор решения: Mr_CatYT
static string BrokeDigit(string word)
{
  string compiledString = "";
  var lengthOfWord = word.Length;
  var numberOfDocumentArray = lengthOfWord - (6 + 1);

  for (int i = 0; i < lengthOfWord; i++)
  {
    if (i <= numberOfDocumentArray)
    {
      compiledString += word[i];

      if (i == numberOfDocumentArray)
      {
        compiledString += '/';
      }
    }

    else if (i >= numberOfDocumentArray && i < (numberOfDocumentArray + 3))
    {
      compiledString += word[i];

      if (i == (numberOfDocumentArray + 2))
      {
        compiledString += '/';
      }
    }

    else
    {
      compiledString += word[i];
    }
  }


  return compiledString;
}
static void Main(string[] args)
{
  var compiledDate = BrokeDigit(Console.ReadLine());
  Console.WriteLine(compiledDate);
}

Ввожу: 1000003202540 Выводит: 1000003/20/2540

P.s.: я переделал прогу под свой новый алгоритм

Алгоритм, если надо:

  1. Я получил длину вводных данных.
  2. Я из всей длины вычел длину года(4 #1997), и длину месяца(2 #07 ).
  3. Я получил длину номера. Всё оставшееся - это год и месяц.
  4. Я прописал длину номера, и когда индекс был последний, я выводил этот символ, потом добавил '/'.
  5. Дальше, я добавлял два символа(месяц), и когда был последний, добавлял '/'.
  6. Потом оставшееся я просто добавил, без каких либо модификаций.
  7. (150050/07/1997) - первое - номер, второе - месяц, третье - год. Длина всего числа(150050071997) - 12 символов(последний - 11 индекс).
→ Ссылка
Автор решения: CrazyElf

Наверное, проще всего это будет сделать при помощи регулярного выражения:

var pattern = @"(\d+?)(\d{2})(\d{4})$";
var replacement = "$1/$2/$3";
var number = Regex.Replace(input, pattern, replacement);
→ Ссылка
Автор решения: return
static void Main()
{
    var input = Console.ReadLine();

    // checks

    var buffer = stackalloc char[input.Length + 2]; // potential stack overflow

    input[..^8].CopyTo(buffer);
    input[^8] = '/';
    input[^7..^5].CopyTo(buffer.Slice(^7));
    input[^5] = '/';
    input[^4..^0].CopyTo(buffer.Slice(^4));

    Console.WriteLine(buffer.ToString());
}

Ну или "в одну строчку":

$"{s[..^8]}/{s[^7..^5]}/{s[^4..^0]}";
→ Ссылка