Toon posts:

[C#] Bestaat er een IsDouble() of IsNumeric() functie?

Pagina: 1
Acties:
  • 2.042 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Ik moet jullie bekennen dat ik thuis niet de MSDN geinstalleerd heb dan is nml m'n laptop schijf vol, ik heb het proberen te zoeken op internet en msdn.microsoft.com maar heb het helaas niet kunnen vinden.

Bestaat er een IsDouble(),IsNumeric() of soort gelijke functie in C#?

Ik wil graag gemakkelijk en snel de invoer van bepaalde textboxes controleren.

  • THIJZEL
  • Registratie: Januari 2001
  • Niet online
Heeft c# wel dynamic typing? Als dat niet zo is en je een variable eerst declareerd dan kan hij maar van één type zijn: het type dat jij opgeeft bij het declareren.

De value van een textbox lijkt me trouwens vrijwel altijd van het type string.

[ Voor 23% gewijzigd door THIJZEL op 05-09-2005 18:30 ]


  • BM
  • Registratie: September 2001
  • Laatst online: 17:37

BM

Admin Softe Goederen
Ik denk dat computeraap wil kijken of de ingevoerde String (dat is immers de output van een textbox) in te voeren is in een variable van het type int of float zonder dit te proberen en me errorhandling aan de slag te gaan.
VB(A) heeft daar wel functies voor IsNumeric("abc") geeft false, terwijl IsNumeric("123") gewoon true teruggeeft

Xbox
Even the dark has a silver lining | I'm all you can imagine times infinity, times three


  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
Anders zou je het ook kunnen controleren met een regex. /[0-9]+/ voor een integer en /[0-9]*\.[0-9]+/ voor een float.

Noushka's Magnificent Dream | Unity


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
http://msdn.microsoft.com

De volledige msdn site is ook online te raadplegen hoor :)

Oops! Google Chrome could not find www.rijks%20museum.nl


Verwijderd

Topicstarter
P_de_B schreef op maandag 05 september 2005 @ 18:34:
http://msdn.microsoft.com

De volledige msdn site is ook online te raadplegen hoor :)
dat staat ook in de OP ;)

Verwijderd

Topicstarter
SpeedAddict schreef op maandag 05 september 2005 @ 18:31:
Ik denk dat computeraap wil kijken of de ingevoerde String (dat is immers de output van een textbox) in te voeren is in een variable van het type int of float zonder dit te proberen en me errorhandling aan de slag te gaan.
VB(A) heeft daar wel functies voor IsNumeric("abc") geeft false, terwijl IsNumeric("123") gewoon true teruggeeft
Precies :7

Verwijderd

Topicstarter
Michali schreef op maandag 05 september 2005 @ 18:33:
Anders zou je het ook kunnen controleren met een regex. /[0-9]+/ voor een integer en /[0-9]*\.[0-9]+/ voor een float.
Dat kan, maar mocht er zoiets zijn als bijv. IsDouble,IsBoolean,IsFloat en IsNumeric dan is dat makkelijker voor mij.

Ik heb nog een keer op MSDN gezocht:
http://support.microsoft....aspx?scid=kb;en-us;329488

[ Voor 13% gewijzigd door Verwijderd op 05-09-2005 18:40 ]


  • Jaap-Jan
  • Registratie: Februari 2001
  • Laatst online: 10:00
Verwijderd schreef op maandag 05 september 2005 @ 18:37:
[...]


Dat kan, maar mocht er zoiets zijn als bijv. IsDouble,IsBoolean,IsFloat en IsNumeric dan is dat makkelijker voor mij.

Ik heb nog een keer op MSDN gezocht:
http://support.microsoft....aspx?scid=kb;en-us;329488
Waarom geen exception handling?

Ik heb geen ervaring met C#, maar ik heb een voorbeeld gevonden op een site: http://www.c-sharpcorner....e/ExceptionHandlingAM.asp. Test2.cs is goed te gebruiken.

| Last.fm | "Mr Bent liked counting. You could trust numbers, except perhaps for pi, but he was working on that in his spare time and it was bound to give in sooner or later." -Terry Pratchett


Verwijderd

Topicstarter
Voor mijn doel is de msdn functie IsNumeric makkelijker, mocht je iets customs willen maken is jouw link idd ook goed.

  • EfBe
  • Registratie: Januari 2000
  • Niet online
Kijk naar System.Double.TryParse

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 23-04 14:31
EfBe schreef op maandag 05 september 2005 @ 19:03:
Kijk naar System.Double.TryParse
Dat is dus ook wat in de msdn-link die computeraap zelf aandraagt ook gedaan wordt ;)

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


  • EfBe
  • Registratie: Januari 2000
  • Niet online
riezebosch schreef op maandag 05 september 2005 @ 19:14:
[...]

Dat is dus ook wat in de msdn-link die computeraap zelf aandraagt ook gedaan wordt ;)
Ah, ja ik ga die msdn links niet na :)

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • whoami
  • Registratie: December 2000
  • Laatst online: 30-04 15:31
Of je kijkt naar Char.IsNumeric
Daarmee check je of je character een getal is of niet.
(Ik geloof dat je ook een overload hebt, waarmee je een string kunt aangeven,maar dat weet ik niet vanbuiten; )

https://fgheysels.github.io/


Verwijderd

Topicstarter
whoami schreef op maandag 05 september 2005 @ 21:19:
Of je kijkt naar Char.IsNumeric
Daarmee check je of je character een getal is of niet.
(Ik geloof dat je ook een overload hebt, waarmee je een string kunt aangeven,maar dat weet ik niet vanbuiten; )
Char.IsNumber

http://msdn.microsoft.com...harclassisnumbertopic.asp

Je kunt geen hele string controleren, enkel een positie in een string.

  • THIJZEL
  • Registratie: Januari 2001
  • Niet online
Verwijderd schreef op maandag 05 september 2005 @ 22:06:
[...]


Char.IsNumber

http://msdn.microsoft.com...harclassisnumbertopic.asp

Je kunt geen hele string controleren, enkel een positie in een string.
nou dan heb je de oplossing toch? schrijf je ff een functie die dit voor elke positie doet. :)

  • EfBe
  • Registratie: Januari 2000
  • Niet online
THIJZEL schreef op maandag 05 september 2005 @ 22:16:
[...]


nou dan heb je de oplossing toch? schrijf je ff een functie die dit voor elke positie doet. :)
Ja en die heet Double.TryParse.... |:(

Je kunt ook:
int foo = 0;
try
{
foo = Convert.ToInt32(myString);
}
catch
{
// swallow;
}

doen, wrap je in een static method in een class en klaar ben je. Een hele thread over zoiets onbenulligs. Als je VB.NET wilt programmeren, ga dan VB.NET programmeren. Dan heb je onzinnigheid als IsNumeric en rampenfuncties als IsDouble()... :/

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • BM
  • Registratie: September 2001
  • Laatst online: 17:37

BM

Admin Softe Goederen
EfBe schreef op maandag 05 september 2005 @ 23:02:
Als je VB.NET wilt programmeren, ga dan VB.NET programmeren. Dan heb je onzinnigheid als IsNumeric en rampenfuncties als IsDouble()... :/
Vergeef me mijn evt n00b-heid, maar wat is er mis met functies als IsNumeric en IsDouble?
Mijn programmeerkennis is niet denderend, maar ik vind die functies wel handig om snel wat waardes te checken.
al kun je waarschijnlijk met inputvalidators van .net een stuk meer

Xbox
Even the dark has a silver lining | I'm all you can imagine times infinity, times three


Verwijderd

Japie_17 schreef op maandag 05 september 2005 @ 18:50:
[...]
Waarom geen exception handling?
Exceptions gooien is een "dure actie."

De Double.TryParse is aanmerkelijk sneller.
SpeedAddict schreef op maandag 05 september 2005 @ 23:25:
[...]

Vergeef me mijn evt n00b-heid, maar wat is er mis met functies als IsNumeric en IsDouble?
Mijn programmeerkennis is niet denderend, maar ik vind die functies wel handig om snel wat waardes te checken.
al kun je waarschijnlijk met inputvalidators van .net een stuk meer
Zie hierboven. IsNumeric en IsDouble zijn functies uit de VisualBasic-namespace en die zijn over het algemeen niet efficient geschreven (performance). Een overblijfsel dus uit de VB6-tijd. Ik snap zelf niet waarom ze geen wrapper om de Double.TryParse hebben geschreven.

Maar ja, het paradepraatje van VB.NET is productiviteit en dan boeit het niet (in ieder geval een stuk minder) of het allemaal wat langzamer is.

[ Voor 9% gewijzigd door Verwijderd op 06-09-2005 07:26 ]


  • EfBe
  • Registratie: Januari 2000
  • Niet online
SpeedAddict schreef op maandag 05 september 2005 @ 23:25:
[...]
Vergeef me mijn evt n00b-heid, maar wat is er mis met functies als IsNumeric en IsDouble?
Met 'IsNumeric' kun je weinig, bv wanneer je een long value in een short wilt proppen dan heb je met IsNumeric geen extra info, je zult toch een routine moeten aanroepen die de convert doet, en dus is IsNumeric overbodig.

IsDouble is gewoon triest. Het nadeel is dat de functie alleen voor double werkt, dus in de trant van IsDouble heb je een heel scala aan functies nodig IN de taal(!) die testen op bepaalde types.

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Hoezo, in de taal? Het is toch gewoon een library functie?

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 10:06

curry684

left part of the evil twins

Japie_17 schreef op maandag 05 september 2005 @ 18:50:
[...]

Waarom geen exception handling?
Exceptions zijn bedoeld voor uitzonderingssituaties af te handelen, niet als control flow mechanisme.

Professionele website nodig?


  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

curry684 schreef op dinsdag 06 september 2005 @ 10:39:
[...]

Exceptions zijn bedoeld voor uitzonderingssituaties af te handelen, niet als control flow mechanisme.
En daarbij, er wordt ergens (intern) gecheckt of de exceptie moet worden gegooit (of de string wel een nummer is), deze check is voor jou belangrijk. Soms zijn ze zo te gebruiken, soms moet je hem zelf bouwen (regex is een idee).

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • EfBe
  • Registratie: Januari 2000
  • Niet online
MSalters schreef op dinsdag 06 september 2005 @ 09:32:
Hoezo, in de taal? Het is toch gewoon een library functie?
IsNumeric is onderdeel van de VB.NET statement list, dus onderdeel van de taal. (net zoals lock(object) dat is in C# : syntactical sugar).
IsDouble() bestaat niet in .NET, kennelijk een lib functie.

edit: hmm, ik zie dat die ranzigheid in de namespace Microsoft.VisualBasic is gebouwd (als een 'shared' method in een module (informationmodule).

Dus in C# zou je kunnen doen:
C#:
1
2
3
using Microsoft.VisualBasic;

bool isNumber = Information.IsNumeric("123");


edit2:
wat me verbaast is dat deze niet naar de vb6 vm called, maar het zelf doet:
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
public static bool IsNumeric(object Expression)
{
      bool flag1;
      IConvertible convertible1 = null;
      if (Expression is IConvertible)
      {
            convertible1 = (IConvertible) Expression;
      }
      if (convertible1 == null)
      {
            if (Expression is char[])
            {
                  Expression = new string((char[]) Expression);
            }
            else
            {
                  return false;
            }
      }
      TypeCode code1 = convertible1.GetTypeCode();
      if ((code1 != TypeCode.String) && (code1 != TypeCode.Char))
      {
            return Utils.IsNumericTypeCode(code1);
      }
      string text1 = convertible1.ToString(null);
      try
      {
            long num2;
            if (!StringType.IsHexOrOctValue(text1, ref num2))
            {
                  double num1;
                  return DoubleType.TryParse(text1, ref num1);
            }
            flag1 = true;
      }
      catch (Exception)
      {
            flag1 = false;
      }
      return flag1;
}

maar dus gewoon tryparse doet :D

Edit3: op zich is er wel wat in de VB.NET taal gebakken dat je niet Information.IsNumeric() hoeft te gebruiken, maar direct IsNumeric() kunt gebruiken. vbc weet kennelijk waar de method staat.

[ Voor 84% gewijzigd door EfBe op 06-09-2005 11:10 ]

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 27-04 18:17

gorgi_19

Kruimeltjes zijn weer op :9

EfBe schreef op dinsdag 06 september 2005 @ 11:00:
[...]

IsNumeric is onderdeel van de VB.NET statement list, dus onderdeel van de taal. (net zoals lock(object) dat is in C# : syntactical sugar). IsDouble() bestaat niet in .NET, kennelijk een lib functie.
IsNumeric staat toch in Microsoft.VisualBasic, waar ook in C# een referentie naar te maken is (weliswaar met erg brakke performance), maar dat is een tweede. :)

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Laatst online: 30-04 15:31
gorgi_19 schreef op dinsdag 06 september 2005 @ 11:02:
[...]

IsNumeric staat toch in Microsoft.VisualBasic, waar ook in C# een referentie naar te maken is (weliswaar met erg brakke performance), maar dat is een tweede. :)
* whoami schiet gorgi_19 af.

https://fgheysels.github.io/


  • pjvandesande
  • Registratie: Maart 2004
  • Nu online

pjvandesande

GC.Collect(head);

gorgi_19 schreef op dinsdag 06 september 2005 @ 11:02:
[...]

IsNumeric staat toch in Microsoft.VisualBasic, waar ook in C# een referentie naar te maken is (weliswaar met erg brakke performance), maar dat is een tweede. :)
Ik kan hem niet vinden in de Microsoft.VisualBasic namespace. Je kunt hem volgens mij in C# niet gebruiken, alleen in VB.NET.

Oh, Information.IsNumeric... zeg dat dan :P

[ Voor 8% gewijzigd door pjvandesande op 06-09-2005 11:15 ]


  • CaptBiele
  • Registratie: Juni 2002
  • Laatst online: 27-08-2021

CaptBiele

No Worries!

wat een superdraad over zo`n onderwerpje. Wel komisch dat de TS zelf al het antwoord gevonden heeft na een keer goed zoeken :)

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Maar het is IDD stom om de IsDouble te gebruiken. dan krijg je ongeveer de volgende code
C#:
1
2
3
4
5
6
7
8
9
bool isDouble;
double myDouble;
string myDoubleString = "12.12123";

isDouble = Information.IsDouble( myDoubleString ); //Hier wordt je double geparsed
if( isDouble )
{
    myDouble = Double.Parse( myDoubleString );//En hier nog een keer.
}

wat er dus eigenlijk op neer komt dat je 2 keer aan het parsen bent terwijl het maar een keer hoeft te gebeuren.

“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.”


  • pjvandesande
  • Registratie: Maart 2004
  • Nu online

pjvandesande

GC.Collect(head);

rwb schreef op dinsdag 06 september 2005 @ 11:47:
Maar het is IDD stom om de IsDouble te gebruiken. dan krijg je ongeveer de volgende code
C#:
1
2
3
4
5
6
7
8
9
bool isDouble;
double myDouble;
string myDoubleString = "12.12123";

isDouble = Information.IsDouble( myDoubleString ); //Hier wordt je double geparsed
if( isDouble )
{
    myDouble = Double.Parse( myDoubleString );//En hier nog een keer.
}

wat er dus eigenlijk op neer komt dat je 2 keer aan het parsen bent terwijl het maar een keer hoeft te gebeuren.
Nee, je controleerd eerst of het een Numeric is, dus of je hem zou kunnen parsen naar een double. Vervolgens ga je hem echt parsen.

Het controleren
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
43
44
45
46
47
public static bool IsNumeric(object Expression)
{
      double num1;
      IConvertible convertible1 = Expression as IConvertible;
      if (convertible1 == null)
      {
            if (Expression is char[])
            {
                  Expression = new string((char[]) Expression);
            }
            else
            {
                  return false;
            }
      }
      TypeCode code1 = convertible1.GetTypeCode();
      if ((code1 != TypeCode.String) && (code1 != TypeCode.Char))
      {
            return Information.IsOldNumericTypeCode(code1);
      }
      string text1 = convertible1.ToString(null);
      try
      {
            long num2;
            if (Utils.IsHexOrOctValue(text1, ref num2))
            {
                  return true;
            }
      }
      catch (StackOverflowException exception1)
      {
            throw exception1;
      }
      catch (OutOfMemoryException exception2)
      {
            throw exception2;
      }
      catch (ThreadAbortException exception3)
      {
            throw exception3;
      }
      catch (Exception)
      {
            return false;
      }
      return DoubleType.TryParse(text1, ref num1);
}


Het parsen
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
public static double Parse(string s, NumberStyles style, IFormatProvider provider)
{
      double num1;
      NumberFormatInfo info1 = NumberFormatInfo.GetInstance(provider);
      try
      {
            num1 = Number.ParseDouble(s, style, info1);
      }
      catch (FormatException)
      {
            string text1 = s.Trim();
            if (text1.Equals(info1.PositiveInfinitySymbol))
            {
                  return double.PositiveInfinity;
            }
            if (text1.Equals(info1.NegativeInfinitySymbol))
            {
                  return double.NegativeInfinity;
            }
            if (!text1.Equals(info1.NaNSymbol))
            {
                  throw;
            }
            return double.NaN;
      }
      return num1;
}


Double.Parse roept weer Number.ParseDouble aan die weer de extern ParseDouble gebruikt.
Pagina: 1