Często dane, które posiadamy musimy odpowiednio sformatować przed ich wyświetleniem.
Jeżeli takie dane musimy zwalidować, to warto zadbać, aby walidowane dane były w takim samym formacie jak je wyświetlamy.
Prosty przykład:
Powiedzmy, że mamy metodę pobierającą kwotę faktury:
[sourcecode language=”csharp”]
var invoiceBalance = GetInvoiceBalance();
[/sourcecode]
Kwotę tą otrzymujemy z dokładnością do 4 miejsc po przecinku.
Jednak przez wyświetleniem formatujemy ją:
[sourcecode language=”csharp”]
litInvoiceBalance.Text = invoiceBalance.ToString("C");
[/sourcecode]
Co w wyświetli nam np. 100,00 zł.
Jak widać nasza zmienna wyświetlana jest z dokładnością do 2 miejsc po przecinku.
Dodatkowo załóżmy, że jeżeli pobrana kwota jest większa od 0, umożliwimy użytkownikowi zaznaczenie RadioButton’a, czyli:
[sourcecode language=”csharp”]
if (invoiceBalance > 0)
{
rbMakePayment.Enabled = true;
}
[/sourcecode]
Niby wszystko ok – aplikacja działa. Jeśli kwota jest większa od 0 możemy zaznaczyć RadioButton’a, a jeśli nie to nie możemy.
Problem pojawi się w sytuacji, kiedy nasza procedura zwróci np. 0,0010.
Co wówczas zrobi nasz program? Wyświetli 0,00 zł, ale jednocześnie pozwoli zaznaczyć RadioButton’a 🙁
Dzieje się tak, ponieważ 0,0010 zaokrąglone do dwóch miejsc po przecinku da nam 0,00, ale podczas walidowania kwota jest większa od zera.
Tego typu błędy są czasami ciężkie do wykrycia – kompilator nic nie zgłosi, a i sam błąd występuje rzadko.
Rozwiązaniem w tym przypadku jest zaokrąglenie naszej kwoty przed wyświetleniem i zwalidowaniem, czyli:
[sourcecode language=”csharp” highlight=”3″]
var invoiceBalance = GetInvoiceBalance();
invoiceBalance = Math.Round(invoiceBalance, 2);
litInvoiceBalance.Text = invoiceBalance.ToString("C");
if (invoiceBalance > 0)
{
rbMakePayment.Enabled = true;
}
[/sourcecode]
Warto zwrócić uwagę na takie sytuacje.
2 comments
Comments are closed.