设计思路:
1. 文本框限制数字和字符输入,只接受有效数字和字符;
2. 字符串转数字、字符转数字及反向处理;
局限性:
本文只考虑了long 类型以内数据进制转换,不适用大数据
具体实现过程:
头文件:
//进制类型
enum NUMSYSTEM{ BIN, OCT, DEC, HEX };
//从当前类型转换至numSys类型
void ConvertTo(NUMSYSTEM numSys);
//从任意进制到十进制的转换
void ToDecimal(CString& strNum ,NUMSYSTEM numSys);
//从十进制到任意进制的转换
void DecimalTo(CString& strNum ,NUMSYSTEM numSys);
//去除数字前面的0
void RemoveZeroBeforeNum(CString &strNum);
//求幂函数
long Power(int aNum, int bNum);
//数字到字符
int CharToNum(TCHAR ch);
//字符到数字
TCHAR NumToChar(int nNum);
实现:
//类型转换函数
void CCalculatorDlg::ConvertTo(NUMSYSTEM numSys)
{
CString strNum;
GetDlgItemText(IDC_EDIT_NUM, strNum);
if (!strNum.IsEmpty())
{
RemoveZeroBeforeNum(strNum);
ToDecimal(strNum, m_numSys);
switch (numSys)
{
case BIN:
DecimalTo(strNum, BIN);
break;
case OCT:
DecimalTo(strNum, OCT);
break;
case HEX:
DecimalTo(strNum, HEX);
break;
default:
break;
}
}
RemoveZeroBeforeNum(strNum);
SetDlgItemText(IDC_EDIT_NUM, strNum);
}
void CCalculatorDlg::ToDecimal(CString& strNum, NUMSYSTEM numSys)
{
int nCount = strNum.GetLength();
int nBase = 0;
long nRet = 0;
switch (numSys)
{
case BIN:
nBase = 2;
break;
case OCT:
nBase = 8;
break;
case HEX:
nBase = 16;
break;
default:
break;
}
if (0 == nBase)return;
while (nCount>0)
{
nRet += CharToNum(strNum.GetAt(0))*Power(nBase, nCount - 1);
strNum.Delete(0);
nCount--;
}
strNum.Format(_T("%d"), nRet);
}
void CCalculatorDlg::DecimalTo(CString& strNum, NUMSYSTEM numSys)
{
long nNum = _ttoi(strNum);
strNum.Empty();
int nBase = 0;
int nRet = 0;//余数
switch (numSys)
{
case BIN:
nBase = 2;
break;
case OCT:
nBase = 8;
break;
case HEX:
nBase = 16;
break;
default:
break;
}
if (0 == nBase)return;
while (nNum>1)
{
nRet = nNum%nBase;
nNum = nNum / nBase;
strNum+=NumToChar(nRet);
}
strNum += NumToChar(nNum);
strNum.MakeReverse();
}
void CCalculatorDlg::RemoveZeroBeforeNum(CString &strNum)
{
while (0==strNum.Find(_T("0")))
{
strNum.Delete(0);
}
}
//求nNum的nCount次幂
long CCalculatorDlg::Power(int nNum, int nCount)
{
long nRet = 1;
while (nCount > 0)
{
nRet *= nNum;
nCount--;
}
return nRet;
}
//类型转换函数
void CCalculatorDlg::ConvertTo(NUMSYSTEM numSys)
{
CString strNum;
GetDlgItemText(IDC_EDIT_NUM, strNum);
if (!strNum.IsEmpty())
{
RemoveZeroBeforeNum(strNum);
ToDecimal(strNum, m_numSys);
switch (numSys)
{
case BIN:
DecimalTo(strNum, BIN);
break;
case OCT:
DecimalTo(strNum, OCT);
break;
case HEX:
DecimalTo(strNum, HEX);
break;
default:
break;
}
}
RemoveZeroBeforeNum(strNum);
SetDlgItemText(IDC_EDIT_NUM, strNum);
}
//字符转数字
int CCalculatorDlg::CharToNum(TCHAR ch)
{
switch (ch)
{
case '0':
return 0;
case '1':
return 1;
case '2':
return 2;
case '3':
return 3;
case '4':
return 4;
case '5':
return 5;
case '6':
return 6;
case '7':
return 7;
case '8':
return 8;
case '9':
return 9;
case 'a':
case 'A':
return 10;
case 'b':
case 'B':
return 11;
case 'c':
case 'C':
return 12;
case 'd':
case 'D':
return 13;
case 'e':
case 'E':
return 14;
case 'f':
case 'F':
return 15;
default:
return NULL;
}
}
//数字转字符
TCHAR CCalculatorDlg::NumToChar(int nNum)
{
switch (nNum)
{
case 0:
return '0';
case 1:
return '1';
case 2:
return '2';
case 3:
return '3';
case 4:
return '4';
case 5:
return '5';
case 6:
return '6';
case 7:
return '7';
case 8:
return '8';
case 9:
return '9';
case 10:
return 'A';
case 11:
return 'B';
case 12:
return 'C';
case 13:
return 'D';
case 14:
return 'E';
case 15:
return 'F';
default:
return NULL;
}
}
更多推荐
vs C++ 进制转换器设计
发布评论