The author really looks like a junior, though unquestionably smart, dev. What he wrote isn't enterprise. Enterprise is spaghetti - the first version would be simple number array and division, and once numbers became strings and math isn't allowed, instead of division just run over the digit characters doing simple modulo 3 math in non-math way - as required - using say if/case as matrixes aren't allowed ( "3456" -> 6 mod 3 is 0, 5 and 0 mod 3 is 2, 4 and 2 is 0, 3 and 0 is 0 -> Fizz ). Met not digit -> drop that number, move to the next. Met decimal dot -> start modulo again (set remainder to 0), and if it is not a first dot in that number -> drop the number, move to next. Basically any new rule is just an additional if/case branch or a flag/counter. Kind of self-documenting and easy to add and to remove/modify.
switch (ch) {
case '1':
case '4':
case '7':
switch(rem) {
case 0:
rem = 1;
break;
case 1:
rem = 2;
break;
...
break;
case '2':
case '5':
...