[C#] Getalvalidatie adhv CultureInfo class

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Roxors
  • Registratie: April 2009
  • Laatst online: 17-09 12:59
Goedemiddag,

Ik probeer functionaliteit te ontwikkelen die de input valideert op geldige Nederlandse getallen.
Zo is 12.34 niet goed, en 12.345,67 weer wel natuurlijk.Dit probeer ik te verwezenlijken door gebruik te maken van de CultureInfo class, zodat dit in het geval van een engelse omgeving ook goed gaat.
Hierto heb ik een test console programma'tje geschreven, echter deze geeft onverwachte resultaten.
De code:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
namespace NumberValidation
{
    class Program
    {
        public static string[] testArray = new string[] {"1.2.3.4.5", "1.2.3.4.5,67", "123.45", "12.345", "123.45,67", "12.345,67", "123.00", "12.345,00", "123.45,67", "12.345,67" };

        static void Main(string[] args)
        {
            System.Globalization.CultureInfo cInfo = Thread.CurrentThread.CurrentCulture;
            System.Globalization.NumberFormatInfo nInfo = cInfo.NumberFormat;
            decimal value = 0;
            bool result = true;

            Console.WriteLine("Specified culture is: " + cInfo.DisplayName);
            Console.WriteLine();
            Console.WriteLine();

            foreach (string str in testArray)
            {
                try
                {
                    value = decimal.Parse(str, nInfo);
                }
                catch
                {
                    result = false;
                }

                Console.WriteLine(string.Format("Trying to format : {0}", str));
                Console.WriteLine(string.Format("Was the conversion succesfull: {0}", result));
                Console.WriteLine(string.Format("The formatted result is: {0}", value));
                Console.WriteLine();
                Console.WriteLine();
            }
        }
    }
}


Zoals gezegd staat de culture op Dutch. Echter, alle getallen in de testArray worden goedgekeurd. Kan iemand me vertellen wat ik verkeerd doe?

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Kijk eens naar de NumberStyles parameter en bijbehorende enum ;)

[ Voor 34% gewijzigd door RobIII op 05-05-2009 13:09 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
En met deze overload van TryParse ( Parse heeft eenzelfde soort overload ) http://msdn.microsoft.com/en-us/library/ew0seb73.aspx hoef je ook geen exception te vangen, maar kan gewoon checken of een number te parsen is.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Roxors
  • Registratie: April 2009
  • Laatst online: 17-09 12:59
Ik heb de try-catch vervangen door onderstaande code maar ik krijg nog steeds dezelfde resultaten? Alles wordt nog steeds goedgekeurd??

C#:
1
result = decimal.TryParse(str, NumberStyles.Number, nInfo, out value);

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Roxors schreef op dinsdag 05 mei 2009 @ 14:12:
Ik heb de try-catch vervangen door onderstaande code maar ik krijg nog steeds dezelfde resultaten? Alles wordt nog steeds goedgekeurd??

C#:
1
result = decimal.TryParse(str, NumberStyles.Number, nInfo, out value);
Wat versta je onder "goedgekeurd"?

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Roxors
  • Registratie: April 2009
  • Laatst online: 17-09 12:59
De regel

C#:
1
Console.WriteLine(string.Format("Was the conversion succesfull: {0}", result)); 


retourneert voor alle waarden true, terwijl ik toch echt verwacht dat "1.2.3.4.5" geen geldige waarde is.
Van het NumberFormatInfo object lijkt alles te kloppen, dat wil zeggen, de waarden in de properties komen overeen met de Nederlandse stijl, het lijkt alleen alsof de TryParse zich hier niets van aantrekt.
Zo is bijvoorbeeld de property NumberGroupSizes ingesteld op 3, wat volgens mij wil zeggen dat het aantal posities links van de DecimalSeperator (",") 3 moet zijn voordat de ThousandSeperator (".") voor mag komen. Of zie ik het nou verkeerd?

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
AFAIK zal (Try)Parse niet afdwingen dat 'cijfergroeperingssymbolen' op de juiste plek staan; ze zijn puur esthetisch om getallen voor ons mensen leesbaar(der) te maken en verder betekenisloos. Het lijkt er op dat (Try)Parse het dus verder ook zal roesten waar ze staan. Ik vrees dat je controle of er 'voldoende' cijfers in de groep zitten dus zelf zult moeten doen.

Dat 123.45 wordt "goedgekeurd" is logisch; je staat immers cijfergroeperingssymbolen toe; je zou wellicht 123,45 bedoelen maar 't wordt (correct) geïnterpreteerd als cijfergroeperingssymbool en dus wordt 123.45 -> 12345

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
Specified culture is: Nederlands (Nederland)


Trying to format : 1.2.3.4.5
Was the conversion succesfull: True
The formatted result is: 12345


Trying to format : 1.2.3.4.5,67
Was the conversion succesfull: True
The formatted result is: 12345,67


Trying to format : 123.45
Was the conversion succesfull: True
The formatted result is: 12345


Trying to format : 12.345
Was the conversion succesfull: True
The formatted result is: 12345


Trying to format : 123.45,67
Was the conversion succesfull: True
The formatted result is: 12345,67


Trying to format : 12.345,67
Was the conversion succesfull: True
The formatted result is: 12345,67


Trying to format : 123.00
Was the conversion succesfull: True
The formatted result is: 12300


Trying to format : 12.345,00
Was the conversion succesfull: True
The formatted result is: 12345,00


Trying to format : 123.45,67
Was the conversion succesfull: True
The formatted result is: 12345,67


Trying to format : 12.345,67
Was the conversion succesfull: True
The formatted result is: 12345,67


In bovenstaande redenering kloppen deze resultaten dus allemaal.

[ Voor 87% gewijzigd door RobIII op 05-05-2009 14:55 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Roxors
  • Registratie: April 2009
  • Laatst online: 17-09 12:59
Ja, daar was ik al bang voor. Ik hoopte echter dat ik iets miste, aangezien er een IFormatProvider object meegegeven kan worden. Het lijkt er dus op dat een CultureInfo object als IFormatProvider meegeven niks toevoegt.

Jammer, dan maar een Regex om correcte getalinvoer af te dwingen :D

Bedankt voor de hulp!

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Roxors schreef op dinsdag 05 mei 2009 @ 15:02:
Het lijkt er dus op dat een CultureInfo object als IFormatProvider meegeven niks toevoegt.
Jawel; zo kun je namelijk een afwijkende cultuur-afhankelijke formattering specificeren onafhankelijk van de thread's cultuur-afhankelijke formattering.

[ Voor 6% gewijzigd door RobIII op 05-05-2009 15:08 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Roxors
  • Registratie: April 2009
  • Laatst online: 17-09 12:59
Heh, ik zei het misschien een beetje kort door de bocht inderdaad, maar dat is wat ik bedoelde. De CultureInfo wordt niet gebruikt om te kijken naar het aantal cijfers voor of na de decimaal/duizendtal separator, waar ik wel van uit ging eigenlijk. Assumptions are the mother of all f...ups :D
Pagina: 1