как разбить число на три части
Есть нумерация которая состоит из номера+месяц+год то-есть 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.: я переделал прогу под свой новый алгоритм
Алгоритм, если надо:
- Я получил длину вводных данных.
- Я из всей длины вычел длину года(4 #1997), и длину месяца(2 #07 ).
- Я получил длину номера. Всё оставшееся - это год и месяц.
- Я прописал длину номера, и когда индекс был последний, я выводил этот символ, потом добавил '/'.
- Дальше, я добавлял два символа(месяц), и когда был последний, добавлял '/'.
- Потом оставшееся я просто добавил, без каких либо модификаций.
- (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]}";