I'm not sure what your parsing rules are exactly, but I'm guessing that you want a dash between every grouping of four digits for a number that is 16 digits long. A number that large can be handled by a java.math.BigDecimal. Here's my main method to test out a DecimalFormat approach (sorry, I did this in JDK 1.4.2, but try it out in 1.3 and see if it works):

One problem here is, what if the number begins with zeros? E.g. "0000111122223333" will be written as "1111-2222-3333", which probably isn't what you'd want. It's possible to write code to prepend 0's and -'s as necessary, but this will end up being more complex than the initial solution with substring.

One possible problem with the substring() approach - is it possible that the string might be less than 12 digits? If the input is "123456", is that an error? Or should that be rendered as "0000-0012-3456"? The latter will require some extra coding. Hopefully this is an erroneous input you don't have to deal with, but it might be worth considering.