【第一篇】Qt学习与使用---将数字转换成中文大写的形式

1.期望实现:

数字 ===> 中文大写

如:  

        123.0456                      ===>                                                   壹贰叁点零肆伍陆

        12003045.678              ===>                     壹仟贰佰零万叁仟零肆拾伍点陆捌

        32012003045.678        ===>    叁佰贰拾亿壹仟贰佰零万叁仟零肆拾伍点陆捌


2.基本思路:

2.1 将数字分成四部分 即: 符号+整数+“点”+小数

2.2 查表拼接---将每一位的数字对应到汉字,将汉字拼接上去。

整数部分有数值单位,小数部分不需要数值单位。


数字表

QStringList numerical_value  =   {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};

单位表

(这个表成员的多少 决定你能装换的最大数值范围)(这里给出的可以让你最大转换 1万亿之下的所有数字(小于1万亿,大于负1万亿)

QStringList numerical_unit   =   {"","拾","佰","仟","万","拾", "佰", "仟", "亿", "拾", "佰", "仟"};

3.难点:

实现查表,再拼接,这样做很简单。但是这样做的结果就是如此:

32012003045.678        ===>    叁佰贰拾零亿壹仟贰佰零拾零万叁仟零佰肆拾伍点陆捌

猛地一看,你可能觉得没什么,但这样的写法是不符合我们中国人读数字的习惯的。

3.1当出现多个连0的情况的时候,需要我们根据情况省略和跳过拼接。


3.2在省略零的时候,要注意分段省略,按照中国人的习惯,4位为一段。我按照 “”,“万”,“亿”将整数部分分成三段(因为我的数字范围是1万亿以下)。

如果不分段,可能会导致,“万”和“亿”的丢失。




4.代码

const QString number_Transfer_BigChinese(const double &Fnumber)
{

    if(qAbs(Fnumber)<0.01)   //保留2位小数时,近似看作零的情况
        return "零";


    //判断正负号
    QString numberSign;//存储符号
    if(Fnumber<0)
        numberSign = "(负数)";
   //将数据的绝对值 转换成字符串,如-58 转成 “58.00”
   QString number = QString::number(qAbs(Fnumber),'f',2);//qAbs绝对值 ,保留两位小数
   QString Left_of_Point;//整数部分
   int length =number.length()-3;//整数部分的长度,(精确度为2,去除小数和小数点)
   if(length>12)
   {
        //qDebug()<<"输入的数值超过范围!"
        return "输入的数值超过范围!";
   }

   QStringList numerical_unit   =   {"","拾","佰","仟","万","拾", "佰", "仟", "亿", "拾", "佰", "仟"};
   QStringList numerical_value  =   {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};

   //数数整数低位多少个连零
   int counter_0=0;
   for(int i =length-1;i>=0;i--)
   {
       if((number[i].toLatin1()-'0' )==0) //从个位开始,向高位走
           counter_0++;
       else
           break;

   }
   if(length==1 && counter_0==1) //0.x
       counter_0=0; //不进行过滤

   //1400  0.2

   for(int i=0,flag=1;i<length-counter_0;i++)
   {
        //5     8       1    2   3
        //伍 拾 捌       壹佰 贰拾 叁
       if((number[i].toLatin1()-'0')==0)
       {
           if((flag!=0 && (length-1-i)%4 != 0) || length ==1) //flag!=0  表示前一个数值 不为0
           Left_of_Point+="零"; //后面不用添加 单位
           if((length-1-i)%4 == 0) //如果0处于分段处,后面需添加单位
           Left_of_Point+=numerical_unit[length-1-i];//添加数值单位

           flag =0; //标记

       }
       else
       {
        flag =1;
        Left_of_Point+=numerical_value[number[i].toLatin1()-'0']; //'5'-'0'==5
        Left_of_Point+=numerical_unit[length-1-i];//添加数值单位

       }
   }
    //QString Right_of_Point;//小数点右侧,小数部分(保留两位)  xxxx.yy
    int totalLength = number.length();
    if(number[totalLength-2]=='0'&&number[totalLength-1]=='0')
    {
        QString Bigcn=numberSign+Left_of_Point+"吨";
        return Bigcn;
    }
    else if(number[totalLength-2]!='0'&&number[totalLength-1]=='0')
    {
        QString Bigcn=numberSign+Left_of_Point+"点"+numerical_value[number[totalLength-2].toLatin1()-'0']+"吨";
        return Bigcn;
    }
    else
    {
        QString Bigcn=numberSign+Left_of_Point+"点"+numerical_value[number[totalLength-2].toLatin1()-'0']+numerical_value[number[totalLength-1].toLatin1()-'0']+"吨";
        return Bigcn;
    }


    return "异常情况";
}

5.欢迎大家留言交流(转载请标明出处噢!(*  ̄3)(ε ̄ *))


猜你喜欢

转载自blog.csdn.net/kshine2017/article/details/79408807