Typ decimal i liczenie ilości cyfr po przecinku

11.06.2011

Pisząc mały program do pomocy w generowaniu formularzy do ZUSu trafiłem na ciekawy problem. Formularz przyjmuje tylko całkowite dane liczbowe (tj. pozbawione kropek tudzież przecinków). Aby móc poprawnie wypełnić formularz danymi zmiennoprzecinkowymi muszę je wcześniej przemnożyć przez 10^n gdzie n to ilość miejsc po przecinku. Teraz powstaje pytanie jak szybko określić ilość miejsc po przecinku typu decimal. Najbardziej siermiężne rozwiązanie to zamiana wartości na tekst i liczenie tego co po kropce. Wolne i problematyczne w aplikacjach wielokulturowych. Z pomocą przychodzi funkcja Decimal.GetBits(), która zamienia liczbę typu decimal na jej reprezentację bitową (tablica 4 x Int32). Aby znaleźć liczbę miejsc po przecinku danej wartości decimal wystarczy taki kod:

var n = Decimal.GetBits(1.123456m)[3] >> 16