(1) Floating points are internally always stored in the same way, without formatting info, so in `\fp_set:Nn \X { \fp_to_decimal:n {#1} }`, the inner call is useless. (2) On the other hand, you can simply do `\fp_to_decimal:n {#1}` to expand to the value of the fp as a decimal number (with all the relevant leading or trailing zeros, no `e`). (3) Don't give a `tl` name to your functions: those are reserved to the kernel only. So `\tl_trim:N` should be `\my_tl_trim:N` perhaps. (4) As egreg says, this is non-expandable, so won't be enough for the OP.