# c# determine if a 50 character string is a number

I am creating an excel document and need a value in a cell to be stored as a string.  If it is a number I need to put an apostrophe in front of it.  I was using decimal.tryparse but that won't work with a 50 digit number.  How can I determine if a string is a number no matter how many characters or digits are there?  I also need it to work with a negative sign, commas and a decimal point.

(Please do not ask me to change the way I am creating the excel, that is not important and is not the question.)

Thanks!

``````decimal out_dec = 0;
//this will always evaluate to false
var isNumber decimal.TryParse("12345678901234567890123456789012345678901234567890", out out_dec)
``````
###### Who is Participating?

IT ConsultantCommented:
If you can use regex, you can use this:
``````@"^-?[0-9]*(,[0-9]{3})*\.?[0-9]*\$"
``````
Works correctly for the following cases:
``````100,000
10,00
1.2.3
50
100000.58796
-50
-23412.6535
-5.3.2
``````

Borrowing the above function name, you could use something like this:
``````public bool IsNumeric(string value)
{
string pattern = @"^-?[0-9]*(,[0-9]{3})*\.?[0-9]*\$";

Regex r = new Regex(pattern);

Match m = r.Match(value)

if (m.Success) {

return true;

}

return false;
}
``````
HTH,
Dan
0

Commented:
You could check each digit:

``````public bool IsNumeric(string value)
{
for (int i = 0; i < value.Length; i++)
{
if (i == 0 && value[i] == '-') continue;

if (!char.IsDigit(value[i]))
{
return false;
}
}

return true;
}
``````
0

Author Commented:
That won't work with decimal points, and commas.  I need a way to determine if it is a real number, not just 0-9, comma, decimal point, and negative sign

for example
100,000 is a number
10,00 is not a number
1.2.3 is not a number
etc...
0

Commented:
OK, I overlooked that bit. Modified:

``````public bool IsNumeric(string value)
{
bool decimalFound = false;

for (int i = 0; i < value.Length; i++)
{
if (i == 0 && value[i] == '-') continue;

if (value[i] == '.')
{
if (decimalFound)
{
return false;
}

decimalFound = true;
}
else if (!char.IsDigit(value[i]))
{
return false;
}
}

return true;
}
``````
0

Commented:
Dan Craciun's pattern also accepts (in case it's relevant):

[nothing]
1. [no fractional part]
100000000,000.00 [partially formatted]
,000.00 [partially formatted]
0

IT ConsultantCommented:
OK, thanks for that.

1. and ,000.00 are easy to solve. Still needs work on the 10000,000.00 part :)

``````@"^-?[0-9]+(,[0-9]{3})*(\.[0-9]+)?\$"
``````
0

Commented:
Try {1,3} rather than +   ; )
0

IT ConsultantCommented:
Yeah, but that's only if the numbers were always grouped by ",". Since that was not the case, I need to use an if (if there is at least an , try to match groups of 3, if not, search for digits only):
``````@"^-?(?(?=.*,)([0-9]{1,3}(,[0-9]{3})*)|([0-9]*))(\.[0-9]+)?\$"
``````
works correctly for:
``````100,000
10,00
1.2.3
50
100000.58796
-50
-23412.6535
-5.3.2
1.
10000000,000.00
,000.00
``````
0

Commented:
You don't need the if...a simple alternation will suffice.

e.g.

``````^-?(?:\d{1,3}(?:,\d{3})+|\d+)(?:\.\d+)?\$
``````
0

IT ConsultantCommented:
Yup, thank you for that. I'm still new at regular expressions and when I don't understand something I fall back to the programmer's way of thinking :)

BTW, I recently found out that  \d is looking for a lot more characters than [0-9], so in the case of long strings it's faster to use [0-9], although I agree it's easier to read \d.

Here are all the characters \d is looking for: http://www.fileformat.info/info/unicode/category/Nd/list.htm
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.