[ASP.NET] Comparevalidator: int check met numberstyles

Pagina: 1
Acties:

  • pjonk
  • Registratie: November 2000
  • Laatst online: 22-11 20:39
Ik ben bezig met een webapplicatie waarin prijzen worden ingevoerd. Hierbij mogen prijzen ook ingevoerd met thousand en decimal seperators. De volgende prijzen zijn dus legaal als invoer:
123456
123.456
123.456,00

De volgende prijs echter niet:
123.456,50

Dit omdat er (bewust) voor gekozen is prijzen in de database als integer op te slaan. Met een Int32.Parse en de juiste numberstyles kan ik dit eenvoudig bewerkstelligen:
C#:
1
2
3
4
5
6
7
8
NumberStyles numStyle = NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands;
CultureInfo nl = new CultureInfo("nl-NL");
string s = "123.456,00";
try
{
    int i = Int32.Parse(s, numStyle, nl);
}
catch (FormatException ex) { } // kon niet worden geconverteerd

Nu wil ik graag client javascript validatie voor deze prijsinvoer. Hiervoor gebruik ik een comparevalidator waar ik als Type een integer heb opgegeven:
HTML:
1
2
3
4
5
6
7
<form id="form1" runat="server">
<div>
    <asp:TextBox ID="Text1" runat="server" />
    <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />
</div>
<asp:comparevalidator ID="Comparevalidator1" runat="server" Type="Integer" ErrorMessage="Is niet numeriek" ControlToValidate="Text1" Operator="DataTypeCheck"></asp:comparevalidator>
</form>

Deze validator accepteert echter geen thousand en decimal seperator. Als ik type naar currency verander is dit wel het geval, maar dan worden bedragen als 123.456,50 ook geaccepteerd en dat is niet de bedoeling. Ik zoek dus een manier om ook een numberformat bij de comparevalidator te kunnen gebruiken. Weet iemand of dit mogelijk is?

It’s nice to be important but it’s more important to be nice


  • Gert
  • Registratie: Juni 1999
  • Laatst online: 07-11-2024
Zal je denk ik regex validatie moeten gebruiken. Een int bevat geen , dus dat gaat nooit werken.

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:15
Dit omdat er (bewust) voor gekozen is prijzen in de database als integer op te slaan.
't Is off-topic, maar ik vind dit toch wel een beetje een rare keuze...
code:
1
2
3
4
5
try
{
    int i = Int32.Parse(s, numStyle, nl);
}
catch (FormatException ex) { }
Dit is niet echt efficient. Een exceptie gooien is redelijk duur; daarbij is het ingeven van foutieve data imho ook niet echt een 'exceptie'. Het is iets wat je kan verwachten; de kans is groot dat de gebruiker foutieve gegevens inbrengt.
Je kan dit beter testen door gebruik te maken van de TryParse method. (Int32.TryParse).

Over je probleem zelf: kan je geen CustomValidator gebruiken ?

https://fgheysels.github.io/


  • pjonk
  • Registratie: November 2000
  • Laatst online: 22-11 20:39
TryParse is inderdaad een stukje efficienter. In .NET 1.1 had je deze alleen voor de Double class. Ik had even over het hoofd gezien dat deze in 2.0 ook voor de Int32 bestaat.
Uiteraard kan ik een CustomValidator gebruiken, maar dan moet ik mijn eigen JavaScript gaan schrijven voor de Client-side validatie. Het liefst gebruik ik zoveel mogelijk de ingebouwde .NET validatie. Een RegEx vind ik nogal overkill dus ik heb besloten om toch maar client-side voor de Currency validatie te gaan. Serverside zal ik als extra validatie ook nog een Int32.TryParse doen.

It’s nice to be important but it’s more important to be nice