# What ways are there to convert an Integer to a list of digits?

How can I convert an Integer to list of numbers? For example:

781049 ==> {7, 8, 1, 0, 4, 9}

What are the possible ways of doing this? How well they compare performance-wise? Is a compiled version faster than IntegerDigits? How to convert huge amounts of large integers to digit form?

-
Have a look at IntegerDigits. – b.gatessucks Apr 10 '13 at 11:39
Or have a look at ToString, Characters and ToExpression, in this order. – István Zachar Apr 10 '13 at 11:47
Sorry all: per this meta discussion, I took the liberty to make a perhaps more useful question. – István Zachar Apr 10 '13 at 11:53
For speed, IntegerDigits is really the way to go about this. – Daniel Lichtblau Apr 10 '13 at 13:37

This is pretty easy if you understood that we live in a world of base 10 and the principles of division with rest:

n = 781049;
Rest@Reverse[Flatten@Last@Reap@FixedPointList[(Sow[Mod[#, 10]]; Quotient[#, 10]) &, n]]
(* {7, 8, 1, 0, 4, 9} *)

or as J.M. suggested with one call to get the quotient and the remainder

With[{n = 781049}, Reverse[Reap[NestList[Block[{q, r},
{q, r} = QuotientRemainder[#, 10]; Sow[r]; q] &, n, IntegerLength[n]]][[-1, 1]]]]

If you really prefer shorter methods, than you could go with

IntegerDigits[n]

or maybe

ToExpression@StringCases[ToString[n], DigitCharacter]

if you like strings. Without giving explicit timings you can safely assume, that every function will be slower than IntegerDigits.

-
It might be nice to add timings to this question, given that István Zachar emphasized this. (+1) – Mr.Wizard Apr 10 '13 at 14:23
f[n_ /; n < 10] := {n};
f[n_] := f[Floor[n/10]]~Join~{n~Mod~10};

f[n0_] := Block[{n = n0, r = {}},
While[n != 0,
r = {n~Mod~10}~Join~r;
n = Floor[n/10]];
r
]

f /@ {123, 142857, 9876}
(*{{1, 2, 3}, {1, 4, 2, 8, 5, 7}, {9, 8, 7, 6}}*)
-
Floor[n/10] is better written as Quotient[n, 10]. – J. M. Apr 10 '13 at 14:30