Here is a function I use to parse phone fields. I’ve tested this on
Windows 95/NT with Visual C++ 5.0 SP1/2.
This works by changing the value to a formatted phone number.
I’m sure there could be some code improvements here, and would
appreciate any suggestions anyone might have.
//Definition void AFXAPI DDX_Phone(CDataExchange* pDX, int nIDC, CString& value); //Implementation void AFXAPI DDX_Phone(CDataExchange* pDX, int nIDC, CString& value) { HWND hWndCtrl = pDX->PrepareEditCtrl(nIDC); if (pDX->m_bSaveAndValidate) { int nLen = ::GetWindowTextLength(hWndCtrl); ::GetWindowText(hWndCtrl, value.GetBufferSetLength(nLen),nLen+1); value.ReleaseBuffer(); } else { CString newValue; for(int x=0; x < value.GetLength();x++) { if(value[x] != '(' && value[x] != ')' && value[x] != '-' && value[x] != ' ' && value[x] != '.') newValue += value[x]; } if(newValue.GetLength()==7) newValue.Format("%s-%s",newValue.Left(3),newValue.Right(4)); else if(newValue.GetLength()==10) newValue.Format("(%s)%s-%s",newValue.Left(3),newValue.Mid(3,3),newValue.Right(4)); else if(newValue.GetLength()>10) newValue.Format("(%s) %s-%s%s",newValue.Left(3),newValue.Mid(3,3),newValue.Mid(6,4),newValue.Right(newValue.GetLength()-10)); else newValue = value; AfxSetWindowText(hWndCtrl, newValue); } }