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)

Open in new window

jackjohnson44Asked:
Who is Participating?
 
Dan CraciunIT ConsultantCommented:
If you can use regex, you can use this:
@"^-?[0-9]*(,[0-9]{3})*\.?[0-9]*$"

Open in new window

Works correctly for the following cases:
100,000
10,00
1.2.3
50
100000.58796
-50
-23412.6535
-5.3.2

Open in new window


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;
}

Open in new window

HTH,
Dan
0
 
käµfm³d 👽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;
}

Open in new window

0
 
jackjohnson44Author 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
Cloud Class® Course: CompTIA Cloud+

The CompTIA Cloud+ Basic training course will teach you about cloud concepts and models, data storage, networking, and network infrastructure.

 
käµfm³d 👽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;
}

Open in new window

0
 
käµfm³d 👽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
 
Dan CraciunIT 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]+)?$"

Open in new window

0
 
käµfm³d 👽Commented:
Try {1,3} rather than +   ; )
0
 
Dan CraciunIT 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]+)?$"

Open in new window

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

Open in new window

0
 
käµfm³d 👽Commented:
You don't need the if...a simple alternation will suffice.

e.g.

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

Open in new window

0
 
Dan CraciunIT 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.