Numbers is 'recognizing' the string of characters as a 'number', rather than as 'text', and strips the leading zeros to display the 'number' in standard notation.
Format the ZIP column as Text before entering the Zip codes, and the full string will be retained.
For codes already entered, your second question applies.
Zip codes come in two formats: nnnnn and nnnnn-nnnn
The extended format will already be interpreted as text (with some exceptions), due to the hyphen in the middle of what would otherwise be a 'number,' so a formula needs to deal only with the original five digit variety.
Here's an example. Column A has been formatted as text. Column B's format was left as Automatic, and the same keystrokes used to enter the codes as in the corresponding cells in Column A. Column C contains a formula to add zeros to the front of codes less than five characters long, and to convert all entries to Text.
Note the failures in lines 10 and 12. Numbers recognizes the string 12-3456 (with the leading zeroes ignored) as the month and year of the date shown, and interprets the entry as a Date and Time value.
C2 (and filled down): =IF(LEN(B)<5,RIGHT("00000"&B,5),""&B)
- Add a temporary column to the right of the column containing the Zip codes.
- Enter the formula.
- Copy the results
- Click on the top cell in the original codes.
- Go Edit > Paste Values
- Delete the temporary column.