I edit my address book in Emacs --- it's a text file, I can grep it, I
can isearch it, I keep it in CVS --- and I prefer keeping things
consistent in it. So here's a little utility I wrote to reformat
phone numbers into a consistent style.
;;; still doesn't handle the formats 4154975513 and 415 4975513
(defun reformat-us-phone-number ()
"Reformat a phone number in a US format into my normal phone number format."
(interactive)
(save-excursion
; XXX these regexen break at end of buffer
(if (looking-at "[0-9]\\{3\\}[-. ][0-9]\\{3\\}[-. ][0-9]\\{4\\}[^0-9]")
(progn
(insert "+1 ")
(forward-char 3)
(delete-char 1)
(insert " ")
(forward-char 3)
(delete-char 1)
(insert " ")
t)
(if (looking-at
"([0-9]\\{3\\})[-. ]?[0-9]\\{3\\}[-. ][0-9]\\{4\\}[^0-9]")
(progn
(insert "+1 ")
(delete-char 1)
(forward-char 3)
(delete-char 1)
(if (looking-at "[-. ]") (delete-char 1))
(insert " ")
(forward-char 3)
(delete-char 1)
(insert " ")
t)
nil))))
(defun magic-reformat-us-phone-number ()
"Reformat a US phone number somewhere in the vicinity."
(interactive)
(or (reformat-us-phone-number)
(save-excursion (forward-char 1) (reformat-us-phone-number))
(save-excursion (backward-char 1) (reformat-us-phone-number))
(and (looking-at "1-[0-9]\\{3\\}")
(progn (delete-char 2) (reformat-us-phone-number)))
(save-excursion (backward-char 12) (reformat-us-phone-number))
(save-excursion (backward-char 13) (reformat-us-phone-number))
(save-excursion (backward-char 14) (reformat-us-phone-number))))
(global-set-key [C-M-tab] 'magic-reformat-us-phone-number)