Solved

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

Posted on 2014-03-14
268 Views
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)
``````
0
Question by:jackjohnson44
• 5
• 4

LVL 74

Expert Comment

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 Comment

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

LVL 74

Expert Comment

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

LVL 34

Accepted Solution

Dan Craciun earned 250 total points
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

LVL 74

Expert Comment

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

LVL 34

Expert Comment

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

LVL 74

Expert Comment

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

LVL 34

Expert Comment

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

LVL 74

Assisted Solution

käµfm³d   👽 earned 250 total points
You don't need the if...a simple alternation will suffice.

e.g.

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

LVL 34

Expert Comment

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

## Featured Post

This document covers how to connect to SQL Server and browse its contents.  It is meant for those new to Visual Studio and/or working with Microsoft SQL Server.  It is not a guide to building SQL Server database connections in your code.  This is mo…
Exception Handling is in the core of any application that is able to dignify its name. In this article, I'll guide you through the process of writing a DRY (Don't Repeat Yourself) Exception Handling mechanism, using Aspect Oriented Programming.
Illustrator's Shape Builder tool will let you combine shapes visually and interactively. This video shows the Mac version, but the tool works the same way in Windows. To follow along with this video, you can draw your own shapes or download the file…
This video gives you a great overview about bandwidth monitoring with SNMP and WMI with our network monitoring solution PRTG Network Monitor (https://www.paessler.com/prtg). If you're looking for how to monitor bandwidth using netflow or packet s…