Expand the number

CJam, 33 26 bytes

r_ee\'0fe<f{\~t~}{},'+*0e|

This won't work with the Java interpreter; it print floats differently. Try it with the CJam interpreter.

The last test case prints 9000000+9e-7, which has been ruled valid by @NinjaBearMonkey.

Thanks to @jimmy23013 for golfing off 7 bytes!

How it works

r_                           Read a token from STDIN and push a copy.
  ee                         Enumerate its characters, i.e., push the array of all
                             [index character] pairs.
    \                        Swap the original input on top of the stack.
     '0fe<                   Perform vectorized minimum with the character '0'.
                             This replaces all digits with '0', but leaves '.'
                             untouched, since `.' < '0'.
          f{    }            For each [index character] pair, push the pair and the
                             string of zeroes and (possibly) a dot; then:
            \                    Swap the pair on top of the stack.
             ~                   Dump index and character on the stack.
              t                  Replace the string's element at that index with
                                 that character.
               ~                 Evaluate the resulting string.
                 {},         Filter the array to remove zeroes.
                    '+*      Join, using '+' as separator.
                       0e|   If the result is empty, replace it with 0.

JavaScript (ES7), 102 bytes

n=>+n&&[...n.replace(/^\.0*|\./,"")].map(f=d=>10**p--*d,p=Math.floor(Math.log10(n))).filter(f).join`+`

Explanation

Requires the number to be input as a string without leading zeroes (unless the number is 0 of course).

Note: Because of floating-point weirdness some numbers (like .3) come out wrong, but theoretically this works for any number.

n=>                             // n = input number as string
  +n&&                          // return 0 if n = 0
  [...n.replace(/^\.0*|\./,"")] // remove leading zeroes after the decimal place
  .map(f=d=>                    // for each digit d in n
      10**p--*d,                // raise the digit to the correct power of 10
    p=Math.floor(Math.log10(n)) // p = power of 10 for the first digit, floor needs to be
  )                             //     used instead of |0 due to negative powers of 10 :(
  .filter(f)                    // remove zeroes, the map function is reused
  .join`+`                      // return the output numbers joined with +

Test

Test uses Math.pow instead of ** for browser compatibility.

var solution = n=>+n&&[...n.replace(/^\.0*|\./,"")].map(f=d=>Math.pow(10,p--)*d,p=Math.floor(Math.log10(n))).filter(f).join`+`
<input type="number" oninput="result.textContent=solution(this.value)">
<pre id="result"></pre>


Retina, 86 77 75 bytes

Byte count assumes that the source is encoded as ISO 8859-1.

S_`.(?<=(\.\d+))|(?=(\d*)).
Tm`d`0`\..+\B|(?<=^\d).+
¶([.0]+¶)*
+
^0.|\+0$

The trailing linefeed is significant.

Try it online.

Explanation

S_`.(?<=(\.\d+))|(?=(\d*)).

We start by turning the input into a linefeed separate list of components, although only the leading (or trailing) digit is correct. This is done by abusing a split stage. Instead of splitting the input we match all of it, so the remaining segments are all empty. We remove those empty segments with the _ option. The catch is that split stages also return the values of all capturing groups. So we use a lookahead at each match to capture the correct part of the string: first we try to find a . left of the match. If that's the case, we capture everything from the . up to and including the digit we're currently matching. Otherwise, we must be in the integer part of the input, so we capture all the numbers after the match (including the match). We must also get rid of the decimal point itself, so the second capture is optional. If there are no \d to be capture, this will simply remove the match from the input.

Tm`d`0`\..+\B|(?<!=\d).+

Now we use a transliteration stage to turn all but the leading/trailing digits into zeroes. We either match a component that's less than 1 with \..+\B where the \B ensures that we stop the match one digit before the end, or we match an integer part with (?<=^\d).+ where the lookbehind ensures that we start one digit into the number. The transliteration stage will then replace any digits (d) with zeroes inside the matches.

¶([.0]+¶)*
+

Now the actual output format should use + not linefeeds as separators. The matches a linefeed to do that substitution. While we're at it, we also remove lines that contain only 0s and .s.

^0.|\+0$

The previous stage does not remove a leading or trailing 0 (because those do not have a linefeed before and after them), so we remove those explicitly.