|

楼主 |
发表于 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;
}
|
|