Entering numbers at the Serial Monitor

but this is one old dog trying to learn new tricks.

I'm pretty sure you borrowed that code from somewhere. It irritates me how many times I see

int incomingByte;

That's nearly as irritating as

byte myInt;
float myChar;
int myFloat;

etc. that I've seen.

If you are going to, unnecessarily, use a type name in a variable name, the type name needs to match the name used in the variable.

char incomingChar;

If you make that change, you'll see that the cast is not necessary, that isdigit() gets a variable of the right size and type, and that the String (ugh?) class gets something to append that it doesn't need to first convert to a String.