Ik krijg twee strings als user input data en wil deze met elkaar vergelijken om te bepalen of ze aan een (door de user gekozen) conditie voldoen. De conditie kan zijn "equals", "not equals", "greater than", "greater than or equals", "less than" of "less than or equals".
De strings kunnen soms numeriek zijn, maar vaak ook niet. Als beide strings numeriek zijn, dan wil ik ze graag numeriek vergelijken. Als beiden inputs niet numeriek zijn, dan voldoet de standaard String.Compare.
Met numeriek bedoel ik inclusief floats en doubles etc!
Een paar voorbeelden:
"23" moet kleiner zijn dan "124" (met String.Compare zal 23 groter zijn)
"23" moet groter zijn dan "124a" (want 124a is niet numeriek en 2 > 1).
"23" moet gelijk zijn aan "23.0"
"-23" en "24" moeten numeriek gechecked worden (en niet op de "-")
Is er een handige of zelfs in het framework ingebouwde manier om dit voor elkaar te krijgen? Het enige wat ik voor elkaar kan krijgen is een grote brei aan checks:
- Is het een integer (int.TryParse)? Dan vergelijk als int.
- Is het een double, dan vergelijk als double.
- Is het een float, dan ...
- Etc.
En voor elk type input moet dus ook een switch statement komen voor de verschillende condities...
Op het moment heb ik het nog relatief compact weten te houden maar dit is nog niet volledig:
Dit checkt alleen nog maar voor integers. En de Equals / NotEquals checkt nog niet goed (dus "23.0" en "23" worden niet gelijk gezien). Als ik dit op deze manier ga uitbreiden voor alle soorten numerieke types dan wordt het een drama...
Het is natuurlijk mogelijk en dan moet ik er maar mee leven, maar ik kan me voorstellen dat er een betere manier is?
Als ik google dan vind ik alleen de standaard replies dat "20" groter is dan "100" omdat 2>1, dat snap ik wel. Het probleem is dat ik de input als numeriek wil vergelijken als dat kan, en anders terug val naar de standaard string compare.
De strings kunnen soms numeriek zijn, maar vaak ook niet. Als beide strings numeriek zijn, dan wil ik ze graag numeriek vergelijken. Als beiden inputs niet numeriek zijn, dan voldoet de standaard String.Compare.
Met numeriek bedoel ik inclusief floats en doubles etc!
Een paar voorbeelden:
"23" moet kleiner zijn dan "124" (met String.Compare zal 23 groter zijn)
"23" moet groter zijn dan "124a" (want 124a is niet numeriek en 2 > 1).
"23" moet gelijk zijn aan "23.0"
"-23" en "24" moeten numeriek gechecked worden (en niet op de "-")
Is er een handige of zelfs in het framework ingebouwde manier om dit voor elkaar te krijgen? Het enige wat ik voor elkaar kan krijgen is een grote brei aan checks:
- Is het een integer (int.TryParse)? Dan vergelijk als int.
- Is het een double, dan vergelijk als double.
- Is het een float, dan ...
- Etc.
En voor elk type input moet dus ook een switch statement komen voor de verschillende condities...
Op het moment heb ik het nog relatief compact weten te houden maar dit is nog niet volledig:
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
38
39
40
41
42
| private bool IsMatch(string value1, string value2) { int i1, i2; switch (ComparisonType) { case ComparisonTypes.Equals: return value1 == value2; case ComparisonTypes.NotEquals: return value1 != value2; case ComparisonTypes.GreaterThan: if (int.TryParse(value1, out i1) && int.TryParse(value2, out i2)) { return i1 > i2; } return String.Compare(value1, value2, StringComparison.InvariantCulture) > 0; case ComparisonTypes.GreaterThanOrEquals: if (int.TryParse(value1, out i1) && int.TryParse(value2, out i2)) { return i1 >= i2; } return String.Compare(value1, value2, StringComparison.InvariantCulture) > -1; case ComparisonTypes.LessThan: if (int.TryParse(value1, out i1) && int.TryParse(value2, out i2)) { return i1 < i2; } return String.Compare(value1, value2, StringComparison.InvariantCulture) < 0; case ComparisonTypes.LessThanOrEquals: if (int.TryParse(value1, out i1) && int.TryParse(value2, out i2)) { return i1 <= i2; } return String.Compare(value1, value2, StringComparison.InvariantCulture) < 1; } return false; } |
Dit checkt alleen nog maar voor integers. En de Equals / NotEquals checkt nog niet goed (dus "23.0" en "23" worden niet gelijk gezien). Als ik dit op deze manier ga uitbreiden voor alle soorten numerieke types dan wordt het een drama...
Het is natuurlijk mogelijk en dan moet ik er maar mee leven, maar ik kan me voorstellen dat er een betere manier is?
Als ik google dan vind ik alleen de standaard replies dat "20" groter is dan "100" omdat 2>1, dat snap ik wel. Het probleem is dat ik de input als numeriek wil vergelijken als dat kan, en anders terug val naar de standaard string compare.