金額數字到中文大寫的轉換--C++代碼

這是以前做的一個打印的小東西,需要用到金額轉換。

在網上搜到做金額轉換的很多都是VB或者JavaScript的代碼,基本上都是利用的字符串替換。感覺用stackpush進去再pop出來好像更容易理解。

轉換前:

轉換後:

 

測試程序:

 

// MoneyConverterTst.cpp : Defines the entry point for the console application.

//

 

#include "stdafx.h"

#include "MoneyConverter.h"

 

#include <iostream>

 

int main(int argc, char* argv[])

{

         MoneyConverter converter;

         tstring money=_T("123400123.19");

         cout<<converter.DigitalStr2Chinese(money)<<endl;

 

         return 0;

}

 


測試程序輸出結果:

MoneyConverter的源代碼:

 // MoneyConverter.h: interface for the MoneyConverter class.

 //

 

 #if !defined(AFX_MONEYCONVERTER_H__AA9A99D8_5205_4BF1_89DE_5E9718A39887__INCLUDED_)

 #define AFX_MONEYCONVERTER_H__AA9A99D8_5205_4BF1_89DE_5E9718A39887__INCLUDED_

 

 #if _MSC_VER > 1000

 #pragma once

 #endif // _MSC_VER > 1000

 

 #include <string>

 #include <stack>

 #include <tchar.h>

 

 typedef  std::basic_string<TCHAR> tstring;

 

 using namespace std;

 

 class MoneyConverter  

 {

 public:

         MoneyConverter();

         virtual ~MoneyConverter();

         

         tstring DigitalStr2Chinese(tstring& str);

 protected:

         //是否合法數字字符串

         bool IsDigitString(tstring& str);

         //轉換整數部分

         tstring ConvertIntergerPart(tstring& str);

         //轉換小數部分

         tstring ConvertFractionalPart(tstring& str);

 private:

         TCHAR* unit1[4];        

         TCHAR* unit2[3];

         TCHAR* unit3[2];

         TCHAR* digital[10];

 };

 

 #endif // !defined(AFX_MONEYCONVERTER_H__AA9A99D8_5205_4BF1_89DE_5E9718A39887__INCLUDED_)


 // MoneyConverter.cpp: implementation of the MoneyConverter class.

 //

 

 #include "stdafx.h"

 #include "MoneyConverter.h"

 

 // Construction/Destruction

 MoneyConverter::MoneyConverter()

 {

         unit1[0]=_T("");unit1[1]=_T("");unit1[2]=_T("");unit1[3]=_T("");

         unit2[0]=_T("");unit2[1]=_T("");unit2[2]=_T("");

         unit3[0]=_T("");unit3[1]=_T("");

         digital[0]=_T("");digital[1]=_T("");digital[2]=_T("");digital[3]=_T("");

         digital[4]=_T("");digital[5]=_T("");digital[6]=_T("");digital[7]=_T("");

         digital[8]=_T("");digital[9]=_T("");

 }

 

 MoneyConverter::~MoneyConverter()

 {

 }

 

 tstring MoneyConverter::DigitalStr2Chinese(tstring& str)

 {

         if(!IsDigitString(str))

                 return _T("not valid digital string!");

 

         int pos=str.find_first_of('.');

         tstring str1=str.substr(0,pos);

         tstring str2;

         if(pos > 0)

                 str2=str.substr(pos+1,str.rfind('.'));

 

         return ConvertIntergerPart(str1)+ConvertFractionalPart(str2);

 }

 

 tstring MoneyConverter::ConvertIntergerPart(tstring& str)

 {

         std::stack<TCHAR*>      s;

         int     index1, index2, pos;

         index1 = index2 = pos = 0;

         s.empty();

         tstring::reverse_iterator it;//從低位開始

         for(it=str.rbegin();it!=str.rend();it++)//入棧

         {

                 if(index2>0 && index1==0)

                         s.push(unit2[index2]);

                 if(*it != '0')

                         s.push(unit1[index1]);

                 //個位上的零不寫,連續的零隻寫一個

                 if(!(*it=='0' && (index1==0 || *(it-1)=='0' )))

                         s.push(digital[*it-'0']);

                 //

                 pos++;

                 index1=pos%4;//每四位一組

                 index2=(pos/4)%3;//

                 //

                 if(pos>8 && index2==0)//大於千萬

                         index2++;

         }

         //

         tstring result;

         while(!s.empty())//出棧

         {

                 tstring c=s.top();

                 if(!c.empty())

                         result.append(c);

                 s.pop();

         }

         result.append(_T(""));

         

         return result;

 }

 

 tstring MoneyConverter::ConvertFractionalPart(tstring& str)

 {

         tstring sJiao,sFen,result;

         if(str.length()==1)

                 sJiao=str.substr(0,1);

         if(str.length() > 1)

                 sFen=str.substr(1,1);

         

         if(sJiao==_T("0")) sJiao=_T("");

         if(sFen==_T("0")) sFen=_T("");

 

         if(sJiao.empty() && sFen.empty()){

                 result=_T("");

         }

         else if(!sJiao.empty() && sFen.empty()){

                 result=tstring(digital[atoi(sJiao.c_str())])+_T("");

         }

         else if(sJiao.empty() && !sFen.empty()){

                 result=tstring(_T(""))+tstring(digital[atoi(sFen.c_str())])+_T("");

         }

         else{

                 result=tstring(digital[atoi(sJiao.c_str())])+tstring(_T(""))+

                         tstring(digital[atoi(sFen.c_str())])+_T("");

         }

 

         return result;

 }

 

 bool MoneyConverter::IsDigitString(tstring& str)

 {       

         if (str.size() == 0) 

                 return false;

         

         std::string::size_type index = 0;

         bool sawdot = false;

         if((str[0] == '-') || (str[0] == '+'))

                 index++;

         for( ; index < str.size(); index++)

         {

                 if (str[index] == '.')

                 {

                         if (sawdot)

                                 return false;

                         else sawdot = true;

                 }

                 else if (!isdigit(str[index]))

                         return false;

         }

         return true;
}

 
發佈了27 篇原創文章 · 獲贊 1 · 訪問量 26萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章