##dc, 56 bytes
dc, 56 bytes
?dZrdd1sa[1+r0r-_1sa]sb0>b[A~rd0<x]dsxxrla*[+z1<y]dsyxp No shorter than Joe's above, but a somewhat different implementation (and one that takes negative numbers as input vs. a subtraction command). Can probably be golfed more, but lunch only lasts so long.
? #input dZrdd #find no. of digits, rotate to bottom of stack, dup input twice 1sa #coefficient for first digit stored in register 'a' [1+r0r-_1sa]sb #macro 'b' executes on negative numbers. add one (for the neg. sign) #rotate this value out of the way, leave a positive copy on top 0>b #run the above macro if negative [A~rd0<x]dsxx #create and run macro 'x'; mod 10 to grab least significant digit #keep doing it if quotient is greater than zero rla* #a zero remains in the way of our most significant digit, rotate it down #and multiply said digit by our coefficient 'a' from earlier [+z1<y]dsyx #add two top stack values (we left that zero there to ensure this always #works), check stack depth and keep doing it while there's stack p #print!