Numeric integrity check
Using strtol() and strtod() would be a preferable way to determine if a string converts to a number.  By using various locale settings, code can work with thousands separators too.  This is a advanced task for a learner, so we will stick with your code. 
Avoid magic numbers.  Rather than code 13, use a derived limit.

// for(int b = 0; b &lt; 13;b++){
for(int b = 0; b &lt; sizeof numdig / sizeof numdig[0] ;b++){

Avoid negated variable names.  Rather than notnum --> valid_num
For boolean variables like notnum/valid_num, use tpye bool.  Be sure to include stdbool.h
Use standard functions like strspn().  This replaces the entire while loop.  Make numdig[] both static and const for better optimization and greater clarity as to its use.

static const char numdig[] = {"0123456789,$."};
bool hasdec = false;
bool valid_num = arr[strspn(arr, numdig)] == '\0';

// search for dp separate
if (valid_num) {
  char *p = strchr(arr, '.');
  // dp found, see if another exist.
  if (p) {
    hasdec = true;
    valid_num = strchr(p+1, '.') == NULL;
  }
}

Good use of const in function signature.

int check_is_numeric(const char *arr)

Surprised signs '-' and '+' were not allowed.
Surprised optional leading whitespace was not allowed; very idiomatic in C.
Tests.  I would have like to see the coding goals specifics and some of your sample test data to assess how thorough the claim "function works exactly as I want it to".  I suspect input like "1,234,,456.0" will pass.
Advanced: '.' as decimal point and ',' as thousands separators is locale dependent.  Research &lt;local.h&gt; for details to make a function that works outside the "C" locale.

char dp = localeconv()-&gt;decimal_point[0];

Code looks like it ends with no return. Drop else.  Avoid !.

 if(valid_num) {
   if(hasdec) return 2;
   return 1;
 }
 return 0;