游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1981|回复: 2

转换数值到中文小写

[复制链接]

45

主题

157

帖子

169

积分

注册会员

Rank: 2

积分
169
QQ
发表于 2009-10-19 21:38:00 | 显示全部楼层 |阅读模式
  因项目需要,在网上找了类似的代码都不理想,所以自已写了一个,程序中采用了递归调用,不知对性能影响如何,也没时间测试,可以支持到万亿级的数字,简单测试了几个数字也没发现bug,可能是测试还不够吧!望大家帮忙测试,然后要是有更好的算法还望赐教!

#include<iostream>
#include<string>

//原型声明
//decimal - 小数精度
const std::string value_chinese_lowercase( double value, unsigned long decimal = 0 );

//数值到中文小写
const std::string value_chinese_lowercase( double value, unsigned long decimal )
{
const char* ChineseNumber_strings[] = { "?", "一", "二", "三", "四", "五", "六", "七", "八", "九" };
std::string strRet = "";
if( value < 0 )
{
  strRet += "负";
  value = -value;
}

double xiaoshu = value;
if( xiaoshu >= 100000000 )xiaoshu -= (double)( (long)( xiaoshu / 100000000 ) ) * 100000000;
if( xiaoshu >= 1 )xiaoshu -= (double)(long)xiaoshu;
  
double zhengshu = value - xiaoshu;
if( zhengshu >= 1 )
{
  if( zhengshu >= 100000000 )
  {
   double yi_zhengshu = (double)(long)( zhengshu / 100000000 );
   strRet += value_chinese_lowercase( yi_zhengshu );
      strRet += "亿";
      if( ( zhengshu - yi_zhengshu * 100000000 ) < 10000000 && ( zhengshu - yi_zhengshu * 100000000 ) > 0 )strRet += "?";
      strRet += value_chinese_lowercase( zhengshu - yi_zhengshu * 100000000 );
    }
    else
    {
      if( zhengshu >= 10000 )
      {
        double wan_zhengshu = (double)(long)( zhengshu / 10000 );
        strRet += value_chinese_lowercase( wan_zhengshu );
        strRet += "万";
        if( ( zhengshu - wan_zhengshu * 10000 ) < 1000 && ( zhengshu - wan_zhengshu * 10000 ) > 0 )strRet += "?";
        strRet += value_chinese_lowercase( zhengshu - wan_zhengshu * 10000 );
      }
      else
      {
        if( zhengshu >= 1000 )
        {
          double qian_zhengshu = (double)(long)( zhengshu / 1000 );
          strRet += value_chinese_lowercase( qian_zhengshu );
          strRet += "千";
          if( ( zhengshu - qian_zhengshu * 1000 ) < 100 && ( zhengshu - qian_zhengshu * 1000 ) > 0 )strRet += "?";
          strRet += value_chinese_lowercase( zhengshu - qian_zhengshu * 1000 );
        }
        else
        {
          if( zhengshu >= 100 )
          {
            double bai_zhengshu = (double)(long)( zhengshu / 100 );
            strRet += value_chinese_lowercase( bai_zhengshu );
            strRet += "百";
            if( ( zhengshu - bai_zhengshu * 100 ) < 10 && ( zhengshu - bai_zhengshu * 100 ) > 0 )strRet += "?";
            strRet += value_chinese_lowercase( zhengshu - bai_zhengshu * 100 );
          }
          else
          {
            if( zhengshu >= 10 )
            {
              double shi_zhengshu = (double)(long)( zhengshu / 10 );
              if( shi_zhengshu != 1 )strRet += value_chinese_lowercase( shi_zhengshu );
              strRet += "十";
              strRet += value_chinese_lowercase( zhengshu - shi_zhengshu * 10 );
            }
            else
            {
              if( xiaoshu >= 0.00000000001 )
              {
                if( (long)zhengshu != 0 )strRet += ChineseNumber_strings[(long)zhengshu];
              }
              else
              {
                if( (long)zhengshu != 0 )return ChineseNumber_strings[(long)zhengshu];
                return "";
              }
            }
          }
        }
      }
    }
  }
  
  if( xiaoshu >= 0.00000000001 )
  {
    if( decimal > 10 || 0 == decimal )decimal = 10; //小数位数

    if( zhengshu >= 1 )strRet += "点";
    else strRet += "?点";
        
    double hex = 10;
    double k = 0;
    while( 0 != decimal && ( xiaoshu >= 0.000000001 )  )
    {
      k = xiaoshu * hex + 0.00000001; //误差补偿
      k = (long)k;
      if( 1 == decimal )
      {
        double tmp = xiaoshu - k / hex;
        tmp = tmp * hex * 10 + 0.00000001;
        if( tmp >= 5 )k += 1;
      }
      strRet += ChineseNumber_strings[(long)k];
      xiaoshu -= k / hex;
      hex *= 10;
      --decimal;
    }
  }
  return strRet;
}

int main()
{
  //测试
  std::cout<<value_chinese_lowercase(1024580.3658, 2)<<std::endl;
  return 0;
}

1

主题

60

帖子

61

积分

注册会员

Rank: 2

积分
61
发表于 2009-10-20 09:29:00 | 显示全部楼层

Re:转换数值到中文小写

LZ强悍

我很笨,一般都先转换为字符串,再一个一个数字替换

45

主题

157

帖子

169

积分

注册会员

Rank: 2

积分
169
QQ
 楼主| 发表于 2009-10-20 12:42:00 | 显示全部楼层

Re: 转换数值到中文小写

转换数值到中文小写

  完美版,改善了十位上的瑕疵!借用了一个中间函数。
#include<iostream>
#include<string>

//原型声明
//decimal - 小数精度
const std::string value_chinese_lowercase( double value, unsigned long decimal = 0 );
const std::string _value_chinese_lowercase( double value, unsigned long decimal = 0 );//中间函数

//数值到中文小写
const std::string value_chinese_lowercase( double value, unsigned long decimal )
{
  std::string strRet = _value_chinese_lowercase( value, decimal );
  if( strRet.size() >= 4 && strRet.substr(0,4) == "一十" )strRet.erase(0,2);
  return strRet;
}
const std::string _value_chinese_lowercase( double value, unsigned long decimal )
{
const char* ChineseNumber_strings[] = { "?", "一", "二", "三", "四", "五", "六", "七", "八", "九" };
std::string strRet = "";
if( value < 0 )
{
  strRet += "负";
  value = -value;
}

double xiaoshu = value;
if( xiaoshu >= 100000000 )xiaoshu -= (double)( (long)( xiaoshu / 100000000 ) ) * 100000000;
if( xiaoshu >= 1 )xiaoshu -= (double)(long)xiaoshu;
  
double zhengshu = value - xiaoshu;
if( zhengshu >= 1 )
{
  if( zhengshu >= 100000000 )
  {
   double yi_zhengshu = (double)(long)( zhengshu / 100000000 );
   strRet += _value_chinese_lowercase( yi_zhengshu );
      strRet += "亿";
      if( ( zhengshu - yi_zhengshu * 100000000 ) < 10000000 && ( zhengshu - yi_zhengshu * 100000000 ) > 0 )strRet += "?";
      strRet += _value_chinese_lowercase( zhengshu - yi_zhengshu * 100000000 );
    }
    else
    {
      if( zhengshu >= 10000 )
      {
        double wan_zhengshu = (double)(long)( zhengshu / 10000 );
        strRet += _value_chinese_lowercase( wan_zhengshu );
        strRet += "万";
        if( ( zhengshu - wan_zhengshu * 10000 ) < 1000 && ( zhengshu - wan_zhengshu * 10000 ) > 0 )strRet += "?";
        strRet += _value_chinese_lowercase( zhengshu - wan_zhengshu * 10000 );
      }
      else
      {
        if( zhengshu >= 1000 )
        {
          double qian_zhengshu = (double)(long)( zhengshu / 1000 );
          strRet += _value_chinese_lowercase( qian_zhengshu );
          strRet += "千";
          if( ( zhengshu - qian_zhengshu * 1000 ) < 100 && ( zhengshu - qian_zhengshu * 1000 ) > 0 )strRet += "?";
          strRet += _value_chinese_lowercase( zhengshu - qian_zhengshu * 1000 );
        }
        else
        {
          if( zhengshu >= 100 )
          {
            double bai_zhengshu = (double)(long)( zhengshu / 100 );
            strRet += _value_chinese_lowercase( bai_zhengshu );
            strRet += "百";
            if( ( zhengshu - bai_zhengshu * 100 ) < 10 && ( zhengshu - bai_zhengshu * 100 ) > 0 )strRet += "?";
            strRet += _value_chinese_lowercase( zhengshu - bai_zhengshu * 100 );
          }
          else
          {
            if( zhengshu >= 10 )
            {
              double shi_zhengshu = (double)(long)( zhengshu / 10 );
              strRet += _value_chinese_lowercase( shi_zhengshu );
              strRet += "十";
              strRet += _value_chinese_lowercase( zhengshu - shi_zhengshu * 10 );
            }
            else
            {
              if( xiaoshu >= 0.00000000001 )
              {
                if( (long)zhengshu != 0 )strRet += ChineseNumber_strings[(long)zhengshu];
              }
              else
              {
                if( (long)zhengshu != 0 )return ChineseNumber_strings[(long)zhengshu];
                return "";
              }
            }
          }
        }
      }
    }
  }
  
  if( xiaoshu >= 0.00000000001 )
  {
    if( decimal > 10 || 0 == decimal )decimal = 10; //小数位数

    if( zhengshu >= 1 )strRet += "点";
    else strRet += "?点";
        
    double hex = 10;
    double k = 0;
    while( 0 != decimal && ( xiaoshu >= 0.000000001 )  )
    {
      k = xiaoshu * hex + 0.00000001; //误差补偿
      k = (long)k;
      if( 1 == decimal )
      {
        double tmp = xiaoshu - k / hex;
        tmp = tmp * hex * 10 + 0.00000001;
        if( tmp >= 5 )k += 1;
      }
      strRet += ChineseNumber_strings[(long)k];
      xiaoshu -= k / hex;
      hex *= 10;
      --decimal;
    }
  }
  return strRet;
}
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-19 21:50

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表