Jakiś czas temu pod koniec jednego z programistycznych rajdów od świtu do świtu pojawiło się zapotrzebowanie na funkcjonalność "masz tu liczbę i zwróć X jej ostatnich cyfr w postaci stringa; w razie potrzeby wypełnij jego początek zerami". Wydaje się banalne i byłem pewny, że w ciągu kwadransa załatwię to odpowiednim formatowaniem integera.
Po półtorej godziny (sic!) lektury MSDN, różnych blogów i popełniania głupich eksperymentów nadal byłem w kropce. Jest to szczególnie irytujące w sytuacji, gdy taka pierdoła będąca ostatnią rzeczą zaplanowaną na aktualną sesję przeciąga się w nieskończoność bezlitośnie kradnąc sen. 10 minut po postanowieniu "screw you, int.ToString()!" miałem gotową metodę:
1: private static string TakeLastXDigits(int number, int length)
2: {
3: string formatted = number.ToString("D" + length);
4: return string.Join(string.Empty,
5: formatted.Skip(formatted.Length - length)
6: .Select(x => x.ToString()
7: ).ToArray());
8: }
Wewnętrzne czułem, że to jak jechanie z Warszawy do Moskwy przez Paryż (ależ trafna geograficzna metafora, a niech mnie!).
No i miałem rację. Zapytany o zdanie ziom potrzebował kilku sekund na usunięcie z tego potwora niesamowitego przerostu formy nad treścią i doprowadzenie go do postaci:
1: private static string TakeLastXDigits(int number, int length)
2: {
3: string formatted = number.ToString("D" + length);
4: return formatted.Substring(formatted.Length - length);
5: }
Pytanie: jak to uprościć jeszcze bardziej? Czy da się to załatwić przekazaniem odpowiedniego formatu do int.ToString()?