看到大家在讨论阿拉伯数字-》汉字数字的转换,拿出我以前写的C版本,当时写输入法的时候顺便写的,完成数字输入到汉字输出的转变

思路:倒着转换(由低位到高位),顺便去“零”,然后倒过来

//注意是Unicode版本的,根据阿拉伯数字构造汉字数字读法,去年用C写输入法的时候顺便写的
void Num2HZNum(int index, LPTSTR str, LPCTSTR strNum)
{
  TCHAR line[MAX_PHRASE_LEN] = _T("");
  TCHAR chNums[2][10][2] =
    {
      {
        _T("零"),   _T("一"), _T("二"), _T("三"), _T("四")
        , _T("五"), _T("六"), _T("七"), _T("八"), _T("九")
      },
      {
        _T("零"), _T("壹"), _T("贰"), _T("叁"), _T("肆")
        , _T("伍"), _T("陆"), _T("柒"), _T("捌"), _T("玖")
      }
    };

  TCHAR hz[2][MAX_NUM2ZH_LEN][2] =
    {
      {
        _T(""),   _T("十"), _T("百"), _T("千"),
        _T("万"), _T("十"), _T("百"), _T("千"),
        _T("亿"), _T("十"), _T("百"), _T("千"),
        _T("万"), _T("十")
      },
      {
        _T(""),   _T("拾"), _T("佰"), _T("仟"),
        _T("万"), _T("拾"), _T("佰"), _T("仟"),
        _T("亿"), _T("拾"), _T("佰"), _T("仟"),
        _T("万"), _T("拾")
      }
    };

  int i;
  int pos = 0;
  TCHAR temp[MAX_PHRASE_LEN];
  for (i=_tcslen(strNum)-1; i>=0; i--)
  {
    temp[_tcslen(strNum)-1-i] = strNum[i];
  }

  *line = _T('\0');
  for (i=0; i<(int)_tcslen(strNum); i++)
  {
    if (temp[i] != _T('0') || hz[index][i][0] == _T('万') || hz[index][i][0] == _T('亿'))
      _tcscat(line, hz[index][i]);

    if (temp[i] == _T('0')
      && (i == 0
        || temp[i-1] == _T('0')
        || line[_tcslen(line) - 1] == _T('万')
        || line[_tcslen(line) - 1] == _T('亿')
        )
      )
      continue;

    _tcscat(line, chNums[index][temp[i] - _T('0')]);
  }

  for (i=0; i<(int)_tcslen(line); i++)
  {
    str[i] = line[_tcslen(line) - 1 -i];
  }
  str[i] = _T('\0');
}



其他讨论参见:

http://www.cnblogs.com/farrio/archive/2005/03/30/128582.html?Pending=true#Post
http://www.cnblogs.com/laser_lu/archive/2005/03/30/128464.html
http://www.cnblogs.com/zane/archive/2005/03/30/128509.html?Pending=true#Post
posted on 2005-03-30 19:03  尉迟方  阅读(1020)  评论(0)    收藏  举报