Click here to Skip to main content
Click here to Skip to main content

Is it really Numeric?

By , 15 Nov 2005
 

Introduction

This is not a true article, it is just a tip about a "trap" that I discovered in the VB.NET IsNumeric() function and that I need to share with the VB programmers community.

Background

If you used VB6 in the past especially, you would know that the IsNumeric() function is able to determine if a given string is convertible to a number or not. Of course, VB.NET also supports it, as it supports many other legacy VB functions (by referencing Microsoft.VisualBasic.dll). These functions should all be avoided in favor of the .NET Framework counterparts, however many VB programmers still use them. That's why I think it's important you are aware of this trap.

The trap

Let's start with this line of code:

MessageBox.Show(IsNumeric("12345").ToString())

Honestly, do you think it will ever return "False"? No, it always returns "True", doesn't it? Well, try it. Now:

  1. Close your application;
  2. Go to Control Panel / Regional and Language Options;
  3. On the "Regional Options" tab, click on the "Customize..." button;
  4. On the "Customize Regional Options" dialog box, change the "Decimal symbol" and the "Digit grouping symbol" in order to have them identical (for example, a comma in both cases);
  5. Confirm your new settings;
  6. Re-run your application: you'll get "False" as a result.

This behavior is due to the ambiguity you created with these settings in the parsing algorithm that tries to convert your string to a number. Other functions such as CDbl() will crash throwing a quite self-explaining exception in this situation, but not IsNumeric(), which simply gives a wrong result...

Let's not discuss about the logic of setting the "Decimal symbol" equal to the "Digit grouping symbol". And let's not discuss about the fact that a system dialog box allows you this kind of a setting! Also, let's not talk about the users' stupidity (yes, I found a user so stupid!). Let's talk about a workaround, to make your code "safe" in the IsNumeric() execution.

A possible workaround

A good workaround consists in explicitly setting the current thread culture, and - with the culture - programmatically setting the "Decimal symbol" and the "Digit grouping symbol", as in:

Imports System.Globalization
Imports System.Threading
...
Dim ci As New CultureInfo("it-IT")
Dim nfi As New NumberFormatInfo
nfi.CurrencyDecimalSeparator = ","
nfi.CurrencyGroupSeparator = "."
ci.NumberFormat = nfi
Thread.CurrentThread.CurrentCulture = ci

Of course, these settings you are "forcing" programmatically are limited to your application context and they won't influence (hopefully) anything else in the system.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

About the Author

Alberto Venditti
Technical Lead
Italy Italy
Member
I was born in 1970.
 
I studied Electronic Engineering (graduated in 1997).
 
Subsequently, I passed some Microsoft exams, and currently I'm certified as:
MCP, MCT, MCDBA, MCSD, MCAD, MCSD for .NET (early achiever).
 
My first computer experience dates back to early 80s, with a Sinclair ZX81.
From that time on, as many "friends" say, my IT-illness has increased year by year.

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
Hint: For improved responsiveness ensure Javascript is enabled and choose 'Normal' from the Layout dropdown and hit 'Update'.
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
GeneralMy vote of 4memberMarqW16 Feb '11 - 4:41 
GeneralAnother way to skin this kind of cat [modified]memberPeterBiddlecombe22 Nov '07 - 22:32 
GeneralRe: Another way to skin this kind of catmemberAlberto Venditti23 Nov '07 - 6:02 
QuestionHow to fix this IsNumberic's error in VB6.0?memberTiger.xing14 Mar '06 - 20:03 
AnswerRe: How to fix this IsNumberic's error in VB6.0?memberAlberto Venditti23 Mar '06 - 21:10 
GeneralCouldnt you just...memberil_manti24 Nov '05 - 0:37 
GeneralRe: Couldnt you just...memberAlberto Venditti24 Nov '05 - 3:34 
GeneralRe: Couldnt you just...memberil_manti24 Nov '05 - 4:33 
GeneralRe: Couldnt you just...memberunklegwar28 Nov '05 - 6:07 
GeneralRe: Couldnt you just...memberAlberto Venditti28 Nov '05 - 22:22 
QuestionAnd Regular Expression?memberWalter O Dias23 Nov '05 - 0:25 
AnswerRe: And Regular Expression?memberAlberto Venditti23 Mar '06 - 21:13 
Generalalternative methods to IsNumeric, IsDate, InStrmemberAlexis Rzewski22 Nov '05 - 2:31 
GeneralRe: alternative methods to IsNumeric, IsDate, InStrmemberAlberto Venditti22 Nov '05 - 23:59 
GeneralRe: alternative methods to IsNumeric, IsDate, InStrmemberAlberto Venditti23 Nov '05 - 0:11 
GeneralNaive IsNumeric() inC#memberGuido_d16 Nov '05 - 1:57 
GeneralRe: Naive IsNumeric() inC#memberMichael Potter16 Nov '05 - 3:38 
GeneralRe: Naive IsNumeric() inC#memberJared James Sullivan26 Oct '07 - 9:36 
GeneralRe: Naive IsNumeric() inC#memberxfx19 Jan '09 - 21:53 
GeneralRe: Naive IsNumeric() inC#membernikoniko23 Nov '05 - 20:49 
GeneralRe: Naive IsNumeric() inC#memberpercyboy19 Dec '05 - 14:13 
GeneralImplement Visual Basic .NET IsNumeric Functionality by Using Visual C# .NETmemberStanimir Angeloff15 Nov '05 - 21:22 
GeneralRe: Implement Visual Basic .NET IsNumeric Functionality by Using Visual C# .NETmemberAlberto Venditti15 Nov '05 - 22:20 
GeneralBetter way IMOmembermav.northwind15 Nov '05 - 19:30 
GeneralRe: Better way IMOmemberAlberto Venditti15 Nov '05 - 22:16 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Permalink | Advertise | Privacy | Mobile
Web03 | 2.6.130516.1 | Last Updated 15 Nov 2005
Article Copyright 2005 by Alberto Venditti
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid