青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-3  評論-5  文章-13  trackbacks-0

在IVR或語音提示中會用到很多播報數(shù)值或金額的片段,現(xiàn)提供源代碼以供參考,如下:

TransNum.h 文件

#ifndef _TransNum_H_  
#define _TransNum_H_  
 
#include "KYLib.h"  
 
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  
 
/* 常量定義 */ 
 
// 轉(zhuǎn)換元素項(translate element item)  
#define TEI_0              0           // 0  
#define TEI_1              1           // 1  
#define TEI_2              2           // 2  
#define TEI_3              3           // 3  
#define TEI_4              4           // 4  
#define TEI_5              5           // 5  
#define TEI_6              6           // 6  
#define TEI_7              7           // 7  
#define TEI_8              8           // 8  
#define TEI_9              9           // 9  
#define TEI_10            10           // 10  
#define TEI_20            11           // 20  
#define TEI_30            12           // 30  
#define TEI_40            13           // 40  
#define TEI_50            14           // 50  
#define TEI_60            15           // 60  
#define TEI_70            16           // 70  
#define TEI_80            17           // 80  
#define TEI_90            18           // 90  
#define TEI_10_2          19           // 百  
#define TEI_10_3          20           // 千  
#define TEI_10_4          21           // 萬  
#define TEI_10_8          22           // 億  
#define TEI_Dot           23           // 點  
#define TEI_Minus         24           // 負  
 
#define TEI_Count         25           // 元素項個數(shù)  
 
// 擴充轉(zhuǎn)換元素項(translate element item)  
#define TEI_Yuan     TEI_Count         // 元  
#define TEI_Jiao     TEI_Count+1       // 角  
#define TEI_Fen      TEI_Count+2       // 分  
#define TEI_End      TEI_Count+3       // 整  
 
#define TEI_Count1   TEI_End+1         // 擴充后元素項個數(shù)  
 
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  
 
/* 公用函數(shù) */ 
 
// 轉(zhuǎn)換數(shù)字串為元素項列表  
// 參數(shù):  
//    APos                 數(shù)字串的開始位置, 并返回結(jié)尾或非數(shù)字串  
//    AEnd                 數(shù)字串的結(jié)尾, 若為 NULL 則判斷'\0'結(jié)尾符號  
//    AElements            存放返回元素項列表, 不允許為 NULL  
//    AMaxSize             AElements 列表的最大尺寸  
// 返回值:  
//    > 0                  返回元素項個數(shù)  
//      0                  調(diào)用失敗, APos不是['0'..'9', '.', '-']開頭  
//     -1                  調(diào)用失敗, 參數(shù)不合法  
//     -2                  調(diào)用失敗, 元素列表的尺寸不足  
long     NumToElements(char* &APos, const char* AEnd, char* AElements, long AMaxSize);  
 
// 擴充為金額的元角分元素(注: AElements 的 MaxSize >= ACount + 2)  
long     ExtractYJFElements(char* AElements, long ACount);  
 
// 元素列表轉(zhuǎn)換成自定義字符串(ATEList 項數(shù)至少為 TEI_Count)  
KYString ElementsToCustom(const KYString* ATEList, const char* AElements, long ACount);  
 
// 元素列表轉(zhuǎn)換成數(shù)量讀法字符串  
KYString ElementsToQuantity(const char* AElements, long ACount);  
 
// 元素列表轉(zhuǎn)換成大寫金額字符串  
KYString ElementsToMoney(const char* AElements, long ACount);  
 
#endif 
#ifndef _TransNum_H_
#define _TransNum_H_

#include "KYLib.h"

// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

/* 常量定義 */

// 轉(zhuǎn)換元素項(translate element item)
#define TEI_0              0           // 0
#define TEI_1              1           // 1
#define TEI_2              2           // 2
#define TEI_3              3           // 3
#define TEI_4              4           // 4
#define TEI_5              5           // 5
#define TEI_6              6           // 6
#define TEI_7              7           // 7
#define TEI_8              8           // 8
#define TEI_9              9           // 9
#define TEI_10            10           // 10
#define TEI_20            11           // 20
#define TEI_30            12           // 30
#define TEI_40            13           // 40
#define TEI_50            14           // 50
#define TEI_60            15           // 60
#define TEI_70            16           // 70
#define TEI_80            17           // 80
#define TEI_90            18           // 90
#define TEI_10_2          19           // 百
#define TEI_10_3          20           // 千
#define TEI_10_4          21           // 萬
#define TEI_10_8          22           // 億
#define TEI_Dot           23           // 點
#define TEI_Minus         24           // 負

#define TEI_Count         25           // 元素項個數(shù)

// 擴充轉(zhuǎn)換元素項(translate element item)
#define TEI_Yuan     TEI_Count         // 元
#define TEI_Jiao     TEI_Count+1       // 角
#define TEI_Fen      TEI_Count+2       // 分
#define TEI_End      TEI_Count+3       // 整

#define TEI_Count1   TEI_End+1         // 擴充后元素項個數(shù)

// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

/* 公用函數(shù) */

// 轉(zhuǎn)換數(shù)字串為元素項列表
// 參數(shù):
//    APos                 數(shù)字串的開始位置, 并返回結(jié)尾或非數(shù)字串
//    AEnd                 數(shù)字串的結(jié)尾, 若為 NULL 則判斷'\0'結(jié)尾符號
//    AElements            存放返回元素項列表, 不允許為 NULL
//    AMaxSize             AElements 列表的最大尺寸
// 返回值:
//    > 0                  返回元素項個數(shù)
//      0                  調(diào)用失敗, APos不是['0'..'9', '.', '-']開頭
//     -1                  調(diào)用失敗, 參數(shù)不合法
//     -2                  調(diào)用失敗, 元素列表的尺寸不足
long     NumToElements(char* &APos, const char* AEnd, char* AElements, long AMaxSize);

// 擴充為金額的元角分元素(注: AElements 的 MaxSize >= ACount + 2)
long     ExtractYJFElements(char* AElements, long ACount);

// 元素列表轉(zhuǎn)換成自定義字符串(ATEList 項數(shù)至少為 TEI_Count)
KYString ElementsToCustom(const KYString* ATEList, const char* AElements, long ACount);

// 元素列表轉(zhuǎn)換成數(shù)量讀法字符串
KYString ElementsToQuantity(const char* AElements, long ACount);

// 元素列表轉(zhuǎn)換成大寫金額字符串
KYString ElementsToMoney(const char* AElements, long ACount);

#endif

TransNum.cpp 文件

#include "TransNum.h"  
 
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  
 
/* 常量定義 */ 
 
// 數(shù)量元素列表  
static const KYString _TE_Quanitys[TEI_Count]  
                     = {"零",          // 0  
                        "一",          // 1  
                        "二",          // 2  
                        "三",          // 3  
                        "四",          // 4  
                        "五",          // 5  
                        "六",          // 6  
                        "七",          // 7  
                        "八",          // 8  
                        "九",          // 9  
                        "十",          // 10  
                        "二十",        // 20  
                        "三十",        // 30  
                        "四十",        // 40  
                        "五十",        // 50  
                        "六十",        // 60  
                        "七十",        // 70  
                        "八十",        // 80  
                        "九十",        // 90  
                        "百",          // 百  
                        "千",          // 千  
                        "萬",          // 萬  
                        "億",          // 億  
                        "點",          // 點  
                        "負"};         // 負  
 
// 金額元素列表  
static const KYString _TE_Moneys[TEI_Count1]  
                     = {"零",          // 0  
                        "壹",          // 1  
                        "貳",          // 2  
                        "叁",          // 3  
                        "肆",          // 4  
                        "伍",          // 5  
                        "陸",          // 6  
                        "柒",          // 7  
                        "捌",          // 8  
                        "玖",          // 9  
                        "壹拾",        // 10  
                        "貳拾",        // 20  
                        "叁拾",        // 30  
                        "肆拾",        // 40  
                        "伍拾",        // 50  
                        "陸拾",        // 60  
                        "柒拾",        // 70  
                        "捌拾",        // 80  
                        "玖拾",        // 90  
                        "佰",          // 百  
                        "仟",          // 千  
                        "萬",          // 萬  
                        "億",          // 億  
                        "點",          // 點  
                        "負",          // 負  
                        "元",          // 元  
                        "角",          // 角  
                        "分",          // 分  
                        "整"};         // 整  
 
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  
 
/* 內(nèi)部函數(shù) */ 
 
// 掃描數(shù)字串并清除左邊的'0'字符  
static long ScanDigitAndTrimLeft(char* &APos)  
{  
   // 過濾 '0' 字符  
   char* pBegin = APos;  
   while (*APos == '0')  
      APos++;  
 
   // 判斷前綴是否為 '0'  
   bool boolPrefix = (pBegin != APos);  
 
   // 繼續(xù)掃描  
   pBegin = APos;  
   while ((*APos >= '0') && (*APos <= '9'))  
      APos++;  
 
   // 計算長度  
   long result = APos - pBegin;  
   if (result == 0)  
      result = boolPrefix;  
 
   // 返回結(jié)果  
   return result;  
}  
 
// 掃描數(shù)字串并清除左邊的'0'字符  
static long ScanDigitAndTrimLeft(char* &APos, const char* AEnd)  
{  
   // 過濾 '0' 字符  
   char* pBegin = APos;  
   while ((APos < AEnd) && (*APos == '0'))  
      APos++;  
 
   // 判斷前綴是否為 '0'  
   bool boolPrefix = (pBegin != APos);  
 
   // 繼續(xù)掃描  
   pBegin = APos;  
   while ((APos < AEnd) && (*APos >= '0') && (*APos <= '9'))  
      APos++;  
 
   // 計算長度  
   long result = APos - pBegin;  
   if (result == 0)  
      result = boolPrefix;  
 
   // 返回結(jié)果  
   return result;  
}  
 
// 掃描數(shù)字串并清除右邊的'0'字符  
static long ScanDigitAndTrimRight(char* &APos)  
{  
   // 初始化  
   char* pBegin   = APos;  
   char* pLast    = APos;  
 
   // 循環(huán)掃描  
   while ((*APos >= '0') && (*APos <= '9'))  
   {  
      if (*APos != '0')  
         pLast = APos + 1;  
 
      APos++;  
   }  
 
   // 返回結(jié)果  
   return (pLast - pBegin);  
}  
 
// 掃描數(shù)字串并清除右邊的'0'字符  
static long ScanDigitAndTrimRight(char* &APos, const char* AEnd)  
{  
   // 初始化  
   char* pBegin   = APos;  
   char* pLast    = APos;  
 
   // 循環(huán)掃描  
   while ((APos < AEnd) && (*APos >= '0') && (*APos <= '9'))  
   {  
      if (*APos != '0')  
         pLast = APos + 1;  
 
      APos++;  
   }  
 
   // 返回結(jié)果  
   return (pLast - pBegin);  
}  
 
// 4位數(shù)轉(zhuǎn)換并返回元素項個數(shù)  
static long Digit4ToElements(char* &ADigit, char ANum, char* &AElement,  
                                     const char* AEnd, bool& AIsOverflow)  
{  
   // 靜態(tài)常量  
   static const char Digit_Unit[4]  = {TEI_0,  TEI_10, TEI_10_2, TEI_10_3};  
   static const char Digit_Ten[10]  = {TEI_0,  TEI_10, TEI_20, TEI_30, TEI_40,  
                                       TEI_50, TEI_60, TEI_70, TEI_80, TEI_90};  
 
   // 初始化  
   char  charItem;  
   bool  boolZero = false;  
   char* pBegin   = AElement;  
 
   // 循環(huán)計算  
   while (ANum > 0)  
   {  
      // 得到元素項  
      charItem = *ADigit - '0';  
      ADigit++;  
      ANum--;  
 
      // 判斷是否為 0  
      if (charItem == 0)  
         boolZero = true;  
      else 
      {  
         // 添加連接 0  
         if (boolZero)  
         {  
            boolZero    = false;  
            *AElement++ = TEI_0;  
         }  
 
         // 檢查是否溢出  
         if (AElement >= AEnd)  
         {  
            AIsOverflow = true;  
            break;  
         }  
         else if (ANum == 1)  
            *AElement++ = Digit_Ten[charItem];  
         else 
         {  
            // 保存元素項  
            *AElement++ = charItem;  
            if (ANum == 0)  
               ;  
            else if (AElement < AEnd)  
               *AElement++ = Digit_Unit[ANum];  
            else 
            {  
               AIsOverflow = true;  
               break;  
            }  
         }  
      }  
   }  
 
   // 返回結(jié)果  
   return (AElement - pBegin);  
}  
 
// 8位數(shù)轉(zhuǎn)換并返回元素項個數(shù)  
static long Digit8ToElements(char* &ADigit, char ANum, char* &AElement,  
                                     const char* AEnd, bool& AIsOverflow)  
{  
   if (ANum <= 4)  
      return Digit4ToElements(ADigit, ANum, AElement, AEnd, AIsOverflow);  
   else 
   {  
      long result = Digit4ToElements(ADigit, ANum - 4, AElement, AEnd, AIsOverflow);  
      if (!AIsOverflow)  
      {  
         // 添加單位(萬)  
         if (result == 0)  
            ;  
         else if (AElement < AEnd)  
         {  
            *AElement++ = TEI_10_4;  
            result++;  
         }  
         else 
            AIsOverflow = true;  
 
         // 判斷是否溢出  
         if (!AIsOverflow)  
            result += Digit4ToElements(ADigit, 4, AElement, AEnd, AIsOverflow);  
      }  
 
      return result;  
   }  
}  
 
// 多位數(shù)轉(zhuǎn)換并返回元素項個數(shù)  
static long DigitsToElements(char* &ADigit, long ANum, char* &AElement,  
                                     const char* AEnd, bool& AIsOverflow)  
{  
   if (ANum <= 8)  
      return Digit8ToElements(ADigit, (char)ANum, AElement, AEnd, AIsOverflow);  
   else 
   {  
      // 初始化  
      char charHead  = ANum & 0x07;  
      long intCycle  = ANum >> 3;  
 
      // 判斷是否 8 位對齊  
      if (charHead == 0)  
      {  
         charHead = 8;  
         intCycle--;  
      }  
 
      // 最高幾位  
      long intNo;  
      long intSub = Digit8ToElements(ADigit, charHead, AElement, AEnd, AIsOverflow);  
      long result = intSub;  
 
      // 循環(huán)處理  
      while (!AIsOverflow && (intCycle > 0))  
      {  
         // 添加單位(億)  
         if (intSub == 0)  
            ;  
         else if (AElement <= AEnd - intCycle)  
            for (intNo = 0; intNo < intCycle; intNo++)  
            {  
               *AElement++ = TEI_10_8;  
               result++;  
            }  
         else 
            AIsOverflow = true;  
 
         // 判斷是否溢出  
         if (!AIsOverflow)  
         {  
            intSub  = Digit8ToElements(ADigit, 8, AElement, AEnd, AIsOverflow);  
            result += intSub;  
            intCycle--;  
         }  
      }  
 
      // 返回結(jié)果  
      return result;  
   }  
}  
 
// 小數(shù)點之后的數(shù)字轉(zhuǎn)換并返回元素項個數(shù)  
static long DecimalToElements(char* ADecimal, long ANum, char* &AElement,  
                                       const char* AEnd, bool& AIsOverflow)  
{  
   if (AElement <= AEnd - ANum)  
   {  
      // 循環(huán)轉(zhuǎn)換  
      for (long intNo = 0; intNo < ANum; intNo++, ADecimal++, AElement++)  
         *AElement = *ADecimal - '0';  
 
      // 返回結(jié)果  
      return ANum;  
   }  
   else 
   {  
      AIsOverflow = true;  
      return 0;  
   }  
}  
 
// 拷貝字符串  
static void CopyString(char* &ADest, const KYString& AStr)  
{  
   long intLen = AStr.Length();  
   if (intLen > 0)  
   {  
      memcpy(ADest, (char*)AStr, intLen);  
      ADest += intLen;  
   }  
}  
 
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  
 
/* 公用函數(shù) */ 
 
// 轉(zhuǎn)換數(shù)字串為元素項列表  
// 參數(shù):  
//    APos                 數(shù)字串的開始位置, 并返回結(jié)尾或非數(shù)字串  
//    AEnd                 數(shù)字串的結(jié)尾, 若為 NULL 則判斷'\0'結(jié)尾符號  
//    AElements            存放返回元素項列表, 不允許為 NULL  
//    AMaxSize             AElements 列表的最大尺寸  
// 返回值:  
//    > 0                  返回元素項個數(shù)  
//      0                  調(diào)用失敗, APos不是['0'..'9', '.', '-']開頭  
//     -1                  調(diào)用失敗, 參數(shù)不合法  
//     -2                  調(diào)用失敗, 元素列表的尺寸不足  
long NumToElements(char* &APos, const char* AEnd, char* AElements, long AMaxSize)  
{  
   // 檢查參數(shù)是否非法  
   if ((APos == NULL) || (AElements == NULL) || (AMaxSize <= 0))  
      return -1;  
   else if (((*APos < '0') || (*APos > '9')) && (*APos != '.') && (*APos != '-'))  
      return 0;  
 
   // 初始化  
   long  result         = 0;  
   bool  boolOverflow   = false;  
   char* pElementEnd    = AElements + AMaxSize;  
   long  intLeft        = 0;  
   long  intRight       = 0;  
   char* pLeft          = NULL;  
   char* pRight         = NULL;  
 
   // 負號  
   if (*APos == '-')  
   {  
      *AElements++ = TEI_Minus;  
      result++;  
      APos++;  
   }  
 
   // 判斷是否以'\0'字符結(jié)尾  
   if (AEnd == NULL)  
   {  
      // 掃描左邊數(shù)字串  
      intLeft = ScanDigitAndTrimLeft(APos);  
      if (intLeft > 0)  
      {  
         pLeft    = APos - intLeft;  
         intLeft  = DigitsToElements(pLeft, intLeft, AElements,  
                                     pElementEnd, boolOverflow);  
         result  += intLeft;  
      }  
 
      // 檢查是否溢出, 并判斷是否存在小數(shù)點  
      if (boolOverflow)  
         result = -2;  
      else if (*APos == '.')  
      {  
         APos++;  
         pRight   = APos;  
         intRight = ScanDigitAndTrimRight(APos);  
         if (intRight > 0)  
         {  
            // 判斷是否需要添加 0  
            if (intLeft == 0)  
            {  
               *AElements++ = TEI_0;  
               result++;  
            }  
 
            // 檢查元素列表容量  
            if (AElements < pElementEnd + intRight)  
            {  
               *AElements++ = TEI_Dot;  
               result++;  
               result      += DecimalToElements(pRight, intRight, AElements,  
                                                pElementEnd, boolOverflow);  
            }  
            else 
               result = -2;  
         }  
         else if (intLeft == 0)  
            result = 0;  
      }  
      else if (intLeft == 0)  
         result = 0;  
   }  
   else 
   {  
      // 掃描左邊數(shù)字串  
      intLeft = ScanDigitAndTrimLeft(APos, AEnd);  
      if (intLeft > 0)  
      {  
         pLeft    = APos - intLeft;  
         intLeft  = DigitsToElements(pLeft, intLeft, AElements,  
                                     pElementEnd, boolOverflow);  
         result  += intLeft;  
      }  
 
      // 檢查是否溢出, 并判斷是否存在小數(shù)點  
      if (boolOverflow)  
         result = -2;  
      else if ((APos < AEnd) && (*APos == '.'))  
      {  
         APos++;  
         pRight   = APos;  
         intRight = ScanDigitAndTrimRight(APos, AEnd);  
         if (intRight > 0)  
         {  
            // 判斷是否需要添加 0  
            if (intLeft == 0)  
            {  
               *AElements++ = TEI_0;  
               result++;  
            }  
 
            // 檢查元素列表容量  
            if (AElements < pElementEnd + intRight)  
            {  
               *AElements++ = TEI_Dot;  
               result++;  
               result      += DecimalToElements(pRight, intRight, AElements,  
                                                pElementEnd, boolOverflow);  
            }  
            else 
               result = -2;  
         }  
         else if (intLeft == 0)  
            result = 0;  
      }  
      else if (intLeft == 0)  
         result = 0;  
   }  
 
   // 返回結(jié)果  
   return result;  
}  
 
// 擴充為金額的元角分元素(注: AElements 的 MaxSize >= ACount + 2)  
long ExtractYJFElements(char* AElements, long ACount)  
{  
   // 查找小數(shù)點  
   long intDot = -1;  
   for (long intNo = 0; intNo < ACount; intNo++, AElements++)  
      if (*AElements == TEI_Dot)  
      {  
         intDot = intNo;  
         break;  
      }  
 
   // 初始化  
   long result   = (intDot >= 0) ? intDot : ACount;  
   bool boolEnd  = true;  
 
   // 添加元  
   *AElements++  = TEI_Yuan;  
   result++;  
 
   // 判斷是否存在小數(shù)點  
   if ((intDot >= 0) && (intDot < ACount - 1))  
   {  
      // 取分值  
      char charFen = (intDot < ACount - 2) ? AElements[1] : 0;  
 
      // 檢查角是否非 0  
      if (*AElements != 0)  
      {  
         *AElements++;  
         *AElements++ = TEI_Jiao;  
         boolEnd      = false;  
         result      += 2;  
      }  
 
      // 檢查分是否非 0  
      if (charFen != 0)  
      {  
         *AElements++ = charFen;  
         *AElements   = TEI_Fen;  
         boolEnd      = false;  
         result      += 2;  
      }  
   }  
 
   // 判斷是否需要添加  
   if (boolEnd)  
   {  
      *AElements  = TEI_End;  
      result++;  
   }  
 
   // 返回結(jié)果  
   return result;  
}  
 
// 元素列表轉(zhuǎn)換成自定義字符串(ATEList 項數(shù)至少為 TEI_Count)  
KYString ElementsToCustom(const KYString* ATEList, const char* AElements, long ACount)  
{  
   // 初始化  
   KYString result;  
 
   // 檢查參數(shù)  
   if ((ATEList != NULL) && (AElements != NULL) && (ACount > 0))  
   {  
      // 初始化  
      long  intNo;  
      long  intSize  = 0;  
      char* pElement = (char*)AElements;  
      char* pPos;  
 
      // 計算尺寸  
      for (intNo = 0; intNo < ACount; intNo++, pElement++)  
         intSize += ATEList[*pElement].Length();  
 
      // 分配內(nèi)存并拷貝數(shù)據(jù)  
      result.SetLength(intSize);  
      pPos     = (char*)result;  
      pElement = (char*)AElements;  
      for (intNo = 0; intNo < ACount; intNo++, pElement++)  
         CopyString(pPos, ATEList[*pElement]);  
   }  
 
   // 返回結(jié)果  
   return result;  
}  
 
// 元素列表轉(zhuǎn)換成數(shù)量讀法字符串  
KYString ElementsToQuantity(const char* AElements, long ACount)  
{  
   return ElementsToCustom(_TE_Quanitys, AElements, ACount);  
}  
 
// 元素列表轉(zhuǎn)換成大寫金額字符串  
KYString ElementsToMoney(const char* AElements, long ACount)  
{  
   return ElementsToCustom(_TE_Moneys, AElements, ACount);  

#include "TransNum.h"

// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

/* 常量定義 */

// 數(shù)量元素列表
static const KYString _TE_Quanitys[TEI_Count]
                     = {"零",          // 0
                        "一",          // 1
                        "二",          // 2
                        "三",          // 3
                        "四",          // 4
                        "五",          // 5
                        "六",          // 6
                        "七",          // 7
                        "八",          // 8
                        "九",          // 9
                        "十",          // 10
                        "二十",        // 20
                        "三十",        // 30
                        "四十",        // 40
                        "五十",        // 50
                        "六十",        // 60
                        "七十",        // 70
                        "八十",        // 80
                        "九十",        // 90
                        "百",          // 百
                        "千",          // 千
                        "萬",          // 萬
                        "億",          // 億
                        "點",          // 點
                        "負"};         // 負

// 金額元素列表
static const KYString _TE_Moneys[TEI_Count1]
                     = {"零",          // 0
                        "壹",          // 1
                        "貳",          // 2
                        "叁",          // 3
                        "肆",          // 4
                        "伍",          // 5
                        "陸",          // 6
                        "柒",          // 7
                        "捌",          // 8
                        "玖",          // 9
                        "壹拾",        // 10
                        "貳拾",        // 20
                        "叁拾",        // 30
                        "肆拾",        // 40
                        "伍拾",        // 50
                        "陸拾",        // 60
                        "柒拾",        // 70
                        "捌拾",        // 80
                        "玖拾",        // 90
                        "佰",          // 百
                        "仟",          // 千
                        "萬",          // 萬
                        "億",          // 億
                        "點",          // 點
                        "負",          // 負
                        "元",          // 元
                        "角",          // 角
                        "分",          // 分
                        "整"};         // 整

// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

/* 內(nèi)部函數(shù) */

// 掃描數(shù)字串并清除左邊的'0'字符
static long ScanDigitAndTrimLeft(char* &APos)
{
   // 過濾 '0' 字符
   char* pBegin = APos;
   while (*APos == '0')
      APos++;

   // 判斷前綴是否為 '0'
   bool boolPrefix = (pBegin != APos);

   // 繼續(xù)掃描
   pBegin = APos;
   while ((*APos >= '0') && (*APos <= '9'))
      APos++;

   // 計算長度
   long result = APos - pBegin;
   if (result == 0)
      result = boolPrefix;

   // 返回結(jié)果
   return result;
}

// 掃描數(shù)字串并清除左邊的'0'字符
static long ScanDigitAndTrimLeft(char* &APos, const char* AEnd)
{
   // 過濾 '0' 字符
   char* pBegin = APos;
   while ((APos < AEnd) && (*APos == '0'))
      APos++;

   // 判斷前綴是否為 '0'
   bool boolPrefix = (pBegin != APos);

   // 繼續(xù)掃描
   pBegin = APos;
   while ((APos < AEnd) && (*APos >= '0') && (*APos <= '9'))
      APos++;

   // 計算長度
   long result = APos - pBegin;
   if (result == 0)
      result = boolPrefix;

   // 返回結(jié)果
   return result;
}

// 掃描數(shù)字串并清除右邊的'0'字符
static long ScanDigitAndTrimRight(char* &APos)
{
   // 初始化
   char* pBegin   = APos;
   char* pLast    = APos;

   // 循環(huán)掃描
   while ((*APos >= '0') && (*APos <= '9'))
   {
      if (*APos != '0')
         pLast = APos + 1;

      APos++;
   }

   // 返回結(jié)果
   return (pLast - pBegin);
}

// 掃描數(shù)字串并清除右邊的'0'字符
static long ScanDigitAndTrimRight(char* &APos, const char* AEnd)
{
   // 初始化
   char* pBegin   = APos;
   char* pLast    = APos;

   // 循環(huán)掃描
   while ((APos < AEnd) && (*APos >= '0') && (*APos <= '9'))
   {
      if (*APos != '0')
         pLast = APos + 1;

      APos++;
   }

   // 返回結(jié)果
   return (pLast - pBegin);
}

// 4位數(shù)轉(zhuǎn)換并返回元素項個數(shù)
static long Digit4ToElements(char* &ADigit, char ANum, char* &AElement,
                                     const char* AEnd, bool& AIsOverflow)
{
   // 靜態(tài)常量
   static const char Digit_Unit[4]  = {TEI_0,  TEI_10, TEI_10_2, TEI_10_3};
   static const char Digit_Ten[10]  = {TEI_0,  TEI_10, TEI_20, TEI_30, TEI_40,
                                       TEI_50, TEI_60, TEI_70, TEI_80, TEI_90};

   // 初始化
   char  charItem;
   bool  boolZero = false;
   char* pBegin   = AElement;

   // 循環(huán)計算
   while (ANum > 0)
   {
      // 得到元素項
      charItem = *ADigit - '0';
      ADigit++;
      ANum--;

      // 判斷是否為 0
      if (charItem == 0)
         boolZero = true;
      else
      {
         // 添加連接 0
         if (boolZero)
         {
            boolZero    = false;
            *AElement++ = TEI_0;
         }

         // 檢查是否溢出
         if (AElement >= AEnd)
         {
            AIsOverflow = true;
            break;
         }
         else if (ANum == 1)
            *AElement++ = Digit_Ten[charItem];
         else
         {
            // 保存元素項
            *AElement++ = charItem;
            if (ANum == 0)
               ;
            else if (AElement < AEnd)
               *AElement++ = Digit_Unit[ANum];
            else
            {
               AIsOverflow = true;
               break;
            }
         }
      }
   }

   // 返回結(jié)果
   return (AElement - pBegin);
}

// 8位數(shù)轉(zhuǎn)換并返回元素項個數(shù)
static long Digit8ToElements(char* &ADigit, char ANum, char* &AElement,
                                     const char* AEnd, bool& AIsOverflow)
{
   if (ANum <= 4)
      return Digit4ToElements(ADigit, ANum, AElement, AEnd, AIsOverflow);
   else
   {
      long result = Digit4ToElements(ADigit, ANum - 4, AElement, AEnd, AIsOverflow);
      if (!AIsOverflow)
      {
         // 添加單位(萬)
         if (result == 0)
            ;
         else if (AElement < AEnd)
         {
            *AElement++ = TEI_10_4;
            result++;
         }
         else
            AIsOverflow = true;

         // 判斷是否溢出
         if (!AIsOverflow)
            result += Digit4ToElements(ADigit, 4, AElement, AEnd, AIsOverflow);
      }

      return result;
   }
}

// 多位數(shù)轉(zhuǎn)換并返回元素項個數(shù)
static long DigitsToElements(char* &ADigit, long ANum, char* &AElement,
                                     const char* AEnd, bool& AIsOverflow)
{
   if (ANum <= 8)
      return Digit8ToElements(ADigit, (char)ANum, AElement, AEnd, AIsOverflow);
   else
   {
      // 初始化
      char charHead  = ANum & 0x07;
      long intCycle  = ANum >> 3;

      // 判斷是否 8 位對齊
      if (charHead == 0)
      {
         charHead = 8;
         intCycle--;
      }

      // 最高幾位
      long intNo;
      long intSub = Digit8ToElements(ADigit, charHead, AElement, AEnd, AIsOverflow);
      long result = intSub;

      // 循環(huán)處理
      while (!AIsOverflow && (intCycle > 0))
      {
         // 添加單位(億)
         if (intSub == 0)
            ;
         else if (AElement <= AEnd - intCycle)
            for (intNo = 0; intNo < intCycle; intNo++)
            {
               *AElement++ = TEI_10_8;
               result++;
            }
         else
            AIsOverflow = true;

         // 判斷是否溢出
         if (!AIsOverflow)
         {
            intSub  = Digit8ToElements(ADigit, 8, AElement, AEnd, AIsOverflow);
            result += intSub;
            intCycle--;
         }
      }

      // 返回結(jié)果
      return result;
   }
}

// 小數(shù)點之后的數(shù)字轉(zhuǎn)換并返回元素項個數(shù)
static long DecimalToElements(char* ADecimal, long ANum, char* &AElement,
                                       const char* AEnd, bool& AIsOverflow)
{
   if (AElement <= AEnd - ANum)
   {
      // 循環(huán)轉(zhuǎn)換
      for (long intNo = 0; intNo < ANum; intNo++, ADecimal++, AElement++)
         *AElement = *ADecimal - '0';

      // 返回結(jié)果
      return ANum;
   }
   else
   {
      AIsOverflow = true;
      return 0;
   }
}

// 拷貝字符串
static void CopyString(char* &ADest, const KYString& AStr)
{
   long intLen = AStr.Length();
   if (intLen > 0)
   {
      memcpy(ADest, (char*)AStr, intLen);
      ADest += intLen;
   }
}

// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

/* 公用函數(shù) */

// 轉(zhuǎn)換數(shù)字串為元素項列表
// 參數(shù):
//    APos                 數(shù)字串的開始位置, 并返回結(jié)尾或非數(shù)字串
//    AEnd                 數(shù)字串的結(jié)尾, 若為 NULL 則判斷'\0'結(jié)尾符號
//    AElements            存放返回元素項列表, 不允許為 NULL
//    AMaxSize             AElements 列表的最大尺寸
// 返回值:
//    > 0                  返回元素項個數(shù)
//      0                  調(diào)用失敗, APos不是['0'..'9', '.', '-']開頭
//     -1                  調(diào)用失敗, 參數(shù)不合法
//     -2                  調(diào)用失敗, 元素列表的尺寸不足
long NumToElements(char* &APos, const char* AEnd, char* AElements, long AMaxSize)
{
   // 檢查參數(shù)是否非法
   if ((APos == NULL) || (AElements == NULL) || (AMaxSize <= 0))
      return -1;
   else if (((*APos < '0') || (*APos > '9')) && (*APos != '.') && (*APos != '-'))
      return 0;

   // 初始化
   long  result         = 0;
   bool  boolOverflow   = false;
   char* pElementEnd    = AElements + AMaxSize;
   long  intLeft        = 0;
   long  intRight       = 0;
   char* pLeft          = NULL;
   char* pRight         = NULL;

   // 負號
   if (*APos == '-')
   {
      *AElements++ = TEI_Minus;
      result++;
      APos++;
   }

   // 判斷是否以'\0'字符結(jié)尾
   if (AEnd == NULL)
   {
      // 掃描左邊數(shù)字串
      intLeft = ScanDigitAndTrimLeft(APos);
      if (intLeft > 0)
      {
         pLeft    = APos - intLeft;
         intLeft  = DigitsToElements(pLeft, intLeft, AElements,
                                     pElementEnd, boolOverflow);
         result  += intLeft;
      }

      // 檢查是否溢出, 并判斷是否存在小數(shù)點
      if (boolOverflow)
         result = -2;
      else if (*APos == '.')
      {
         APos++;
         pRight   = APos;
         intRight = ScanDigitAndTrimRight(APos);
         if (intRight > 0)
         {
            // 判斷是否需要添加 0
            if (intLeft == 0)
            {
               *AElements++ = TEI_0;
               result++;
            }

            // 檢查元素列表容量
            if (AElements < pElementEnd + intRight)
            {
               *AElements++ = TEI_Dot;
               result++;
               result      += DecimalToElements(pRight, intRight, AElements,
                                                pElementEnd, boolOverflow);
            }
            else
               result = -2;
         }
         else if (intLeft == 0)
            result = 0;
      }
      else if (intLeft == 0)
         result = 0;
   }
   else
   {
      // 掃描左邊數(shù)字串
      intLeft = ScanDigitAndTrimLeft(APos, AEnd);
      if (intLeft > 0)
      {
         pLeft    = APos - intLeft;
         intLeft  = DigitsToElements(pLeft, intLeft, AElements,
                                     pElementEnd, boolOverflow);
         result  += intLeft;
      }

      // 檢查是否溢出, 并判斷是否存在小數(shù)點
      if (boolOverflow)
         result = -2;
      else if ((APos < AEnd) && (*APos == '.'))
      {
         APos++;
         pRight   = APos;
         intRight = ScanDigitAndTrimRight(APos, AEnd);
         if (intRight > 0)
         {
            // 判斷是否需要添加 0
            if (intLeft == 0)
            {
               *AElements++ = TEI_0;
               result++;
            }

            // 檢查元素列表容量
            if (AElements < pElementEnd + intRight)
            {
               *AElements++ = TEI_Dot;
               result++;
               result      += DecimalToElements(pRight, intRight, AElements,
                                                pElementEnd, boolOverflow);
            }
            else
               result = -2;
         }
         else if (intLeft == 0)
            result = 0;
      }
      else if (intLeft == 0)
         result = 0;
   }

   // 返回結(jié)果
   return result;
}

// 擴充為金額的元角分元素(注: AElements 的 MaxSize >= ACount + 2)
long ExtractYJFElements(char* AElements, long ACount)
{
   // 查找小數(shù)點
   long intDot = -1;
   for (long intNo = 0; intNo < ACount; intNo++, AElements++)
      if (*AElements == TEI_Dot)
      {
         intDot = intNo;
         break;
      }

   // 初始化
   long result   = (intDot >= 0) ? intDot : ACount;
   bool boolEnd  = true;

   // 添加元
   *AElements++  = TEI_Yuan;
   result++;

   // 判斷是否存在小數(shù)點
   if ((intDot >= 0) && (intDot < ACount - 1))
   {
      // 取分值
      char charFen = (intDot < ACount - 2) ? AElements[1] : 0;

      // 檢查角是否非 0
      if (*AElements != 0)
      {
         *AElements++;
         *AElements++ = TEI_Jiao;
         boolEnd      = false;
         result      += 2;
      }

      // 檢查分是否非 0
      if (charFen != 0)
      {
         *AElements++ = charFen;
         *AElements   = TEI_Fen;
         boolEnd      = false;
         result      += 2;
      }
   }

   // 判斷是否需要添加
   if (boolEnd)
   {
      *AElements  = TEI_End;
      result++;
   }

   // 返回結(jié)果
   return result;
}

// 元素列表轉(zhuǎn)換成自定義字符串(ATEList 項數(shù)至少為 TEI_Count)
KYString ElementsToCustom(const KYString* ATEList, const char* AElements, long ACount)
{
   // 初始化
   KYString result;

   // 檢查參數(shù)
   if ((ATEList != NULL) && (AElements != NULL) && (ACount > 0))
   {
      // 初始化
      long  intNo;
      long  intSize  = 0;
      char* pElement = (char*)AElements;
      char* pPos;

      // 計算尺寸
      for (intNo = 0; intNo < ACount; intNo++, pElement++)
         intSize += ATEList[*pElement].Length();

      // 分配內(nèi)存并拷貝數(shù)據(jù)
      result.SetLength(intSize);
      pPos     = (char*)result;
      pElement = (char*)AElements;
      for (intNo = 0; intNo < ACount; intNo++, pElement++)
         CopyString(pPos, ATEList[*pElement]);
   }

   // 返回結(jié)果
   return result;
}

// 元素列表轉(zhuǎn)換成數(shù)量讀法字符串
KYString ElementsToQuantity(const char* AElements, long ACount)
{
   return ElementsToCustom(_TE_Quanitys, AElements, ACount);
}

// 元素列表轉(zhuǎn)換成大寫金額字符串
KYString ElementsToMoney(const char* AElements, long ACount)
{
   return ElementsToCustom(_TE_Moneys, AElements, ACount);
}
 

測試代碼:

#include <stdio.h>  
#include "TransNum.h"  
 
// 語音文件元素列表  
static const KYString _TE_Voices[TEI_Count1]  
               = {"s_0.wav,",          // 0  
                  "s_1.wav,",          // 1  
                  "s_2.wav,",          // 2  
                  "s_3.wav,",          // 3  
                  "s_4.wav,",          // 4  
                  "s_5.wav,",          // 5  
                  "s_6.wav,",          // 6  
                  "s_7.wav,",          // 7  
                  "s_8.wav,",          // 8  
                  "s_9.wav,",          // 9  
                  "s_10.wav,",         // 10  
                  "s_20.wav,",         // 20  
                  "s_30.wav,",         // 30  
                  "s_40.wav,",         // 40  
                  "s_50.wav,",         // 50  
                  "s_60.wav,",         // 60  
                  "s_70.wav,",         // 70  
                  "s_80.wav,",         // 80  
                  "s_90.wav,",         // 90  
                  "s_10_2.wav,",       // 百  
                  "s_10_3.wav,",       // 千  
                  "s_10_4.wav,",       // 萬  
                  "s_10_8.wav,",       // 億  
                  "s_dot.wav,",        // 點  
                  "s_minu.wav,",       // 負  
                  "s_yuan.wav,",       // 元  
                  "s_jiao.wav,",       // 角  
                  "s_fen.wav,",        // 分  
                  "s_end.wav,"};       // 整  
 
// 輸出轉(zhuǎn)換結(jié)果  
static void OutputTransResult(TKYDebugFile& AFile, const KYString& AValue)  
{  
   // 靜態(tài)常量  
   static const KYString Log_Line      = "----------------------------------------" 
                                         "----------------------------------------";  
   static const KYString Fmt_Log1      = "translate {length: %d, value: %s}";  
   static const KYString Fmt_Log2      = "elements  {return: %d, pos: %d, max: %d}";  
   static const KYString Fmt_Log3      = "extractYJF{return: %d}";  
   static const KYString Fmt_Log4      = "quantity  {%s}";  
   static const KYString Fmt_Log5      = "money     {%s}";  
   static const KYString Fmt_Log6      = "voices    {%s}";  
 
   // 初始化  
   KYString strElements;  
   long     intCount, intLen;  
   char*    pElements;  
   char*    pBegin   = (char*)AValue;  
   char*    pPos     = pBegin;  
 
   // 分配元素列表緩沖區(qū)  
   intLen = AValue.Length();  
   strElements.SetLength(intLen + intLen);  
   pElements = (char*)strElements;  
 
   // 轉(zhuǎn)換數(shù)字串為元素項列表  
   AFile.WriteFmt(Time(), Fmt_Log1, intLen, pBegin);  
   intCount = NumToElements(pPos, pBegin + intLen, pElements, strElements.Length());  
   AFile.WriteFmt(Time(), Fmt_Log2, intCount, pPos - pBegin + 1, strElements.Length());  
 
   // 若轉(zhuǎn)換元素表成功則輸出  
   if (intCount > 0)  
   {  
      // 初始化  
      KYString strResult;  
 
      strResult = ElementsToQuantity(pElements, intCount);  
      AFile.WriteFmt(Time(), Fmt_Log4, (char*)strResult);  
 
      strResult = ElementsToMoney(pElements, intCount);  
      AFile.WriteFmt(Time(), Fmt_Log5, (char*)strResult);  
 
      strResult = ElementsToCustom(_TE_Voices, pElements, intCount);  
      AFile.WriteFmt(Time(), Fmt_Log6, (char*)strResult);  
 
      intCount  = ExtractYJFElements(pElements, intCount);  
      AFile.WriteFmt(Time(), Fmt_Log3, intCount);  
 
      strResult = ElementsToMoney(pElements, intCount);  
      AFile.WriteFmt(Time(), Fmt_Log5, (char*)strResult);  
 
      strResult = ElementsToCustom(_TE_Voices, pElements, intCount);  
      AFile.WriteFmt(Time(), Fmt_Log6, (char*)strResult);  
   }  
 
   // 結(jié)束  
   AFile.Write(Log_Line);  
}  
 
// 主函數(shù)  
int main(int argc, char* argv[])  
{  
   // 靜態(tài)常量  
   static const KYString File_Config   = "Translate.ini";  
   static const KYString File_Output   = "Translate.txt";  
   static const KYString Name_Sect     = "config";  
   static const KYString Key_Count     = "count";  
   static const KYString Fmt_Item      = "value_%d";  
 
   // 初始化  
   TKYDebugFile objFile;  
 
   // 打開輸出文件  
   if (objFile.Open(CurrAppFilePath + File_Output, false))  
   {  
      // 初始化  
      long     intNo, intCount;  
      KYString strValue;  
      TIniFile iniConfig(CurrAppFilePath + File_Config);  
 
      // 循環(huán)輸出  
      intCount = iniConfig.ReadInteger(Name_Sect, Key_Count, 0);  
      for (intNo = 0; intNo < intCount; intNo++)  
      {  
         strValue = iniConfig.ReadString(Name_Sect, Format(Fmt_Item, intNo), "");  
         if (strValue.Length() != 0)  
            OutputTransResult(objFile, strValue);  
      }  
   }  
   else 
      printf("output file <%s> opens failure!\n", (char*)File_Output);  
 
   // 返回  
   return 0;  

#include <stdio.h>
#include "TransNum.h"

// 語音文件元素列表
static const KYString _TE_Voices[TEI_Count1]
               = {"s_0.wav,",          // 0
                  "s_1.wav,",          // 1
                  "s_2.wav,",          // 2
                  "s_3.wav,",          // 3
                  "s_4.wav,",          // 4
                  "s_5.wav,",          // 5
                  "s_6.wav,",          // 6
                  "s_7.wav,",          // 7
                  "s_8.wav,",          // 8
                  "s_9.wav,",          // 9
                  "s_10.wav,",         // 10
                  "s_20.wav,",         // 20
                  "s_30.wav,",         // 30
                  "s_40.wav,",         // 40
                  "s_50.wav,",         // 50
                  "s_60.wav,",         // 60
                  "s_70.wav,",         // 70
                  "s_80.wav,",         // 80
                  "s_90.wav,",         // 90
                  "s_10_2.wav,",       // 百
                  "s_10_3.wav,",       // 千
                  "s_10_4.wav,",       // 萬
                  "s_10_8.wav,",       // 億
                  "s_dot.wav,",        // 點
                  "s_minu.wav,",       // 負
                  "s_yuan.wav,",       // 元
                  "s_jiao.wav,",       // 角
                  "s_fen.wav,",        // 分
                  "s_end.wav,"};       // 整

// 輸出轉(zhuǎn)換結(jié)果
static void OutputTransResult(TKYDebugFile& AFile, const KYString& AValue)
{
   // 靜態(tài)常量
   static const KYString Log_Line      = "----------------------------------------"
                                         "----------------------------------------";
   static const KYString Fmt_Log1      = "translate {length: %d, value: %s}";
   static const KYString Fmt_Log2      = "elements  {return: %d, pos: %d, max: %d}";
   static const KYString Fmt_Log3      = "extractYJF{return: %d}";
   static const KYString Fmt_Log4      = "quantity  {%s}";
   static const KYString Fmt_Log5      = "money     {%s}";
   static const KYString Fmt_Log6      = "voices    {%s}";

   // 初始化
   KYString strElements;
   long     intCount, intLen;
   char*    pElements;
   char*    pBegin   = (char*)AValue;
   char*    pPos     = pBegin;

   // 分配元素列表緩沖區(qū)
   intLen = AValue.Length();
   strElements.SetLength(intLen + intLen);
   pElements = (char*)strElements;

   // 轉(zhuǎn)換數(shù)字串為元素項列表
   AFile.WriteFmt(Time(), Fmt_Log1, intLen, pBegin);
   intCount = NumToElements(pPos, pBegin + intLen, pElements, strElements.Length());
   AFile.WriteFmt(Time(), Fmt_Log2, intCount, pPos - pBegin + 1, strElements.Length());

   // 若轉(zhuǎn)換元素表成功則輸出
   if (intCount > 0)
   {
      // 初始化
      KYString strResult;

      strResult = ElementsToQuantity(pElements, intCount);
      AFile.WriteFmt(Time(), Fmt_Log4, (char*)strResult);

      strResult = ElementsToMoney(pElements, intCount);
      AFile.WriteFmt(Time(), Fmt_Log5, (char*)strResult);

      strResult = ElementsToCustom(_TE_Voices, pElements, intCount);
      AFile.WriteFmt(Time(), Fmt_Log6, (char*)strResult);

      intCount  = ExtractYJFElements(pElements, intCount);
      AFile.WriteFmt(Time(), Fmt_Log3, intCount);

      strResult = ElementsToMoney(pElements, intCount);
      AFile.WriteFmt(Time(), Fmt_Log5, (char*)strResult);

      strResult = ElementsToCustom(_TE_Voices, pElements, intCount);
      AFile.WriteFmt(Time(), Fmt_Log6, (char*)strResult);
   }

   // 結(jié)束
   AFile.Write(Log_Line);
}

// 主函數(shù)
int main(int argc, char* argv[])
{
   // 靜態(tài)常量
   static const KYString File_Config   = "Translate.ini";
   static const KYString File_Output   = "Translate.txt";
   static const KYString Name_Sect     = "config";
   static const KYString Key_Count     = "count";
   static const KYString Fmt_Item      = "value_%d";

   // 初始化
   TKYDebugFile objFile;

   // 打開輸出文件
   if (objFile.Open(CurrAppFilePath + File_Output, false))
   {
      // 初始化
      long     intNo, intCount;
      KYString strValue;
      TIniFile iniConfig(CurrAppFilePath + File_Config);

      // 循環(huán)輸出
      intCount = iniConfig.ReadInteger(Name_Sect, Key_Count, 0);
      for (intNo = 0; intNo < intCount; intNo++)
      {
         strValue = iniConfig.ReadString(Name_Sect, Format(Fmt_Item, intNo), "");
         if (strValue.Length() != 0)
            OutputTransResult(objFile, strValue);
      }
   }
   else
      printf("output file <%s> opens failure!\n", (char*)File_Output);

   // 返回
   return 0;
}


測試例子結(jié)果:

view plaincopy to clipboardprint?
11:42:14.828 -> translate {length: 5, value: -asdf}  
11:42:14.828 -> elements  {return: 0, pos: 2, max: 10}  
--------------------------------------------------------------------------------  
11:42:14.828 -> translate {length: 11, value: -0000000100}  
11:42:14.828 -> elements  {return: 3, pos: 12, max: 22}  
11:42:14.828 -> quantity  {負一百}  
11:42:14.828 -> money     {負壹佰}  
11:42:14.828 -> voices    {s_minu.wav,s_1.wav,s_10_2.wav,}  
11:42:14.828 -> extractYJF{return: 5}  
11:42:14.828 -> money     {負壹佰元整}  
11:42:14.828 -> voices    {s_minu.wav,s_1.wav,s_10_2.wav,s_yuan.wav,s_end.wav,}  
--------------------------------------------------------------------------------  
11:42:14.828 -> translate {length: 28, value: -0000000000100.1000000000000}  
11:42:14.828 -> elements  {return: 5, pos: 29, max: 56}  
11:42:14.828 -> quantity  {負一百點一}  
11:42:14.828 -> money     {負壹佰點壹}  
11:42:14.828 -> voices    {s_minu.wav,s_1.wav,s_10_2.wav,s_dot.wav,s_1.wav,}  
11:42:14.828 -> extractYJF{return: 6}  
11:42:14.828 -> money     {負壹佰元壹角}  
11:42:14.828 -> voices    {s_minu.wav,s_1.wav,s_10_2.wav,s_yuan.wav,s_1.wav,s_jiao.wav,}  
--------------------------------------------------------------------------------  
11:42:14.828 -> translate {length: 41, value: 001000000002333330000333333000.0000040000}  
11:42:14.828 -> elements  {return: 37, pos: 42, max: 82}  
11:42:14.828 -> quantity  {一千億億億零二百三十三億億三千三百三十萬零三億三千三百三十三萬三千點零零零零零四}  
11:42:14.828 -> money     {壹仟億億億零貳佰叁拾叁億億叁仟叁佰叁拾萬零叁億叁仟叁佰叁拾叁萬叁仟點零零零零零肆}  
11:42:14.828 -> voices    {s_1.wav,s_10_3.wav,s_10_8.wav,s_10_8.wav,s_10_8.wav,s_0.wav,s_2.wav,s_10_2.wav,s_30.wav,s_3.wav,s_10_8.wav,s_10_8.wav,s_3.wav,s_10_3.wav,s_3.wav,s_10_2.wav,s_30.wav,s_10_4.wav,s_0.wav,s_3.wav,s_10_8.wav,s_3.wav,s_10_3.wav,s_3.wav,s_10_2.wav,s_30.wav,s_3.wav,s_10_4.wav,s_3.wav,s_10_3.wav,s_dot.wav,s_0.wav,s_0.wav,s_0.wav,s_0.wav,s_0.wav,s_4.wav,}  
11:42:14.828 -> extractYJF{return: 32}  
11:42:14.828 -> money     {壹仟億億億零貳佰叁拾叁億億叁仟叁佰叁拾萬零叁億叁仟叁佰叁拾叁萬叁仟元整}  
11:42:14.828 -> voices    {s_1.wav,s_10_3.wav,s_10_8.wav,s_10_8.wav,s_10_8.wav,s_0.wav,s_2.wav,s_10_2.wav,s_30.wav,s_3.wav,s_10_8.wav,s_10_8.wav,s_3.wav,s_10_3.wav,s_3.wav,s_10_2.wav,s_30.wav,s_10_4.wav,s_0.wav,s_3.wav,s_10_8.wav,s_3.wav,s_10_3.wav,s_3.wav,s_10_2.wav,s_30.wav,s_3.wav,s_10_4.wav,s_3.wav,s_10_3.wav,s_yuan.wav,s_end.wav,}  
--------------------------------------------------------------------------------  
11:42:14.828 -> translate {length: 42, value: 000000000000002489034000234899345.20920000}  
11:42:14.828 -> elements  {return: 33, pos: 43, max: 84}  
11:42:14.828 -> quantity  {二百四十八億億九千零三十四萬零二億三千四百八十九萬九千三百四十五點二零九二}  
11:42:14.828 -> money     {貳佰肆拾捌億億玖仟零叁拾肆萬零貳億叁仟肆佰捌拾玖萬玖仟叁佰肆拾伍點貳零玖貳}  
11:42:14.828 -> voices    {s_2.wav,s_10_2.wav,s_40.wav,s_8.wav,s_10_8.wav,s_10_8.wav,s_9.wav,s_10_3.wav,s_0.wav,s_30.wav,s_4.wav,s_10_4.wav,s_0.wav,s_2.wav,s_10_8.wav,s_3.wav,s_10_3.wav,s_4.wav,s_10_2.wav,s_80.wav,s_9.wav,s_10_4.wav,s_9.wav,s_10_3.wav,s_3.wav,s_10_2.wav,s_40.wav,s_5.wav,s_dot.wav,s_2.wav,s_0.wav,s_9.wav,s_2.wav,}  
11:42:14.828 -> extractYJF{return: 31}  
11:42:14.828 -> money     {貳佰肆拾捌億億玖仟零叁拾肆萬零貳億叁仟肆佰捌拾玖萬玖仟叁佰肆拾伍元貳角}  
11:42:14.828 -> voices    {s_2.wav,s_10_2.wav,s_40.wav,s_8.wav,s_10_8.wav,s_10_8.wav,s_9.wav,s_10_3.wav,s_0.wav,s_30.wav,s_4.wav,s_10_4.wav,s_0.wav,s_2.wav,s_10_8.wav,s_3.wav,s_10_3.wav,s_4.wav,s_10_2.wav,s_80.wav,s_9.wav,s_10_4.wav,s_9.wav,s_10_3.wav,s_3.wav,s_10_2.wav,s_40.wav,s_5.wav,s_yuan.wav,s_2.wav,s_jiao.wav,}  
--------------------------------------------------------------------------------  
11:42:14.828 -> translate {length: 10, value: 1991.23993}  
11:42:14.828 -> elements  {return: 12, pos: 11, max: 20}  
11:42:14.828 -> quantity  {一千九百九十一點二三九九三}  
11:42:14.828 -> money     {壹仟玖佰玖拾壹點貳叁玖玖叁}  
11:42:14.828 -> voices    {s_1.wav,s_10_3.wav,s_9.wav,s_10_2.wav,s_90.wav,s_1.wav,s_dot.wav,s_2.wav,s_3.wav,s_9.wav,s_9.wav,s_3.wav,}  
11:42:14.828 -> extractYJF{return: 11}  
11:42:14.828 -> money     {壹仟玖佰玖拾壹元貳角叁分}  
11:42:14.828 -> voices    {s_1.wav,s_10_3.wav,s_9.wav,s_10_2.wav,s_90.wav,s_1.wav,s_yuan.wav,s_2.wav,s_jiao.wav,s_3.wav,s_fen.wav,}  
--------------------------------------------------------------------------------  
11:42:14.828 -> translate {length: 20, value: 90899900002399.01023}  
11:42:14.828 -> elements  {return: 21, pos: 21, max: 40}  
11:42:14.828 -> quantity  {九十萬八千九百九十九億二千三百九十九點零一零二三}  
11:42:14.828 -> money     {玖拾萬捌仟玖佰玖拾玖億貳仟叁佰玖拾玖點零壹零貳叁}  
11:42:14.828 -> voices    {s_90.wav,s_10_4.wav,s_8.wav,s_10_3.wav,s_9.wav,s_10_2.wav,s_90.wav,s_9.wav,s_10_8.wav,s_2.wav,s_10_3.wav,s_3.wav,s_10_2.wav,s_90.wav,s_9.wav,s_dot.wav,s_0.wav,s_1.wav,s_0.wav,s_2.wav,s_3.wav,}  
11:42:14.828 -> extractYJF{return: 18}  
11:42:14.828 -> money     {玖拾萬捌仟玖佰玖拾玖億貳仟叁佰玖拾玖元壹分}  
11:42:14.828 -> voices    {s_90.wav,s_10_4.wav,s_8.wav,s_10_3.wav,s_9.wav,s_10_2.wav,s_90.wav,s_9.wav,s_10_8.wav,s_2.wav,s_10_3.wav,s_3.wav,s_10_2.wav,s_90.wav,s_9.wav,s_yuan.wav,s_1.wav,s_fen.wav,}  
--------------------------------------------------------------------------------  
11:42:14.828 -> translate {length: 11, value: 98832212000}  
11:42:14.828 -> elements  {return: 14, pos: 12, max: 22}  
11:42:14.828 -> quantity  {九百八十八億三千二百二十一萬二千}  
11:42:14.828 -> money     {玖佰捌拾捌億叁仟貳佰貳拾壹萬貳仟}  
11:42:14.828 -> voices    {s_9.wav,s_10_2.wav,s_80.wav,s_8.wav,s_10_8.wav,s_3.wav,s_10_3.wav,s_2.wav,s_10_2.wav,s_20.wav,s_1.wav,s_10_4.wav,s_2.wav,s_10_3.wav,}  
11:42:14.828 -> extractYJF{return: 16}  
11:42:14.828 -> money     {玖佰捌拾捌億叁仟貳佰貳拾壹萬貳仟元整}  
11:42:14.828 -> voices    {s_9.wav,s_10_2.wav,s_80.wav,s_8.wav,s_10_8.wav,s_3.wav,s_10_3.wav,s_2.wav,s_10_2.wav,s_20.wav,s_1.wav,s_10_4.wav,s_2.wav,s_10_3.wav,s_yuan.wav,s_end.wav,}  
--------------------------------------------------------------------------------  
11:42:14.828 -> translate {length: 6, value: 100200}  
11:42:14.828 -> elements  {return: 5, pos: 7, max: 12}  
11:42:14.828 -> quantity  {十萬零二百}  
11:42:14.828 -> money     {壹拾萬零貳佰}  
11:42:14.828 -> voices    {s_10.wav,s_10_4.wav,s_0.wav,s_2.wav,s_10_2.wav,}  
11:42:14.828 -> extractYJF{return: 7}  
11:42:14.828 -> money     {壹拾萬零貳佰元整}  
11:42:14.828 -> voices    {s_10.wav,s_10_4.wav,s_0.wav,s_2.wav,s_10_2.wav,s_yuan.wav,s_end.wav,}  
--------------------------------------------------------------------------------  
11:42:14.828 -> translate {length: 8, value: 23000000}  
11:42:14.828 -> elements  {return: 5, pos: 9, max: 16}  
11:42:14.828 -> quantity  {二千三百萬}  
11:42:14.828 -> money     {貳仟叁佰萬}  
11:42:14.828 -> voices    {s_2.wav,s_10_3.wav,s_3.wav,s_10_2.wav,s_10_4.wav,}  
11:42:14.828 -> extractYJF{return: 7}  
11:42:14.828 -> money     {貳仟叁佰萬元整}  
11:42:14.828 -> voices    {s_2.wav,s_10_3.wav,s_3.wav,s_10_2.wav,s_10_4.wav,s_yuan.wav,s_end.wav,}  
--------------------------------------------------------------------------------  
11:42:14.828 -> translate {length: 15, value: 293000000000000}  
11:42:14.828 -> elements  {return: 6, pos: 16, max: 30}  
11:42:14.828 -> quantity  {二百九十三萬億}  
11:42:14.828 -> money     {貳佰玖拾叁萬億}  
11:42:14.828 -> voices    {s_2.wav,s_10_2.wav,s_90.wav,s_3.wav,s_10_4.wav,s_10_8.wav,}  
11:42:14.828 -> extractYJF{return: 8}  
11:42:14.828 -> money     {貳佰玖拾叁萬億元整}  
11:42:14.828 -> voices    {s_2.wav,s_10_2.wav,s_90.wav,s_3.wav,s_10_4.wav,s_10_8.wav,s_yuan.wav,s_end.wav,}  
-------------------------------------------------------------------------------- 

 

本文來自CSDN博客,轉(zhuǎn)載請標明出處:http://blog.csdn.net/kyee/archive/2009/11/07/4783425.aspx

posted on 2011-05-22 12:51 Kyee Ye 閱讀(269) 評論(0)  編輯 收藏 引用 所屬分類: 源碼
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美精品一区二| 亚洲国产岛国毛片在线| 黄色一区三区| 日韩视频在线观看一区二区| 性欧美办公室18xxxxhd| 男人插女人欧美| 一本到12不卡视频在线dvd| 香蕉久久夜色精品国产使用方法| 玖玖玖免费嫩草在线影院一区| 欧美日韩一区三区| **性色生活片久久毛片| 亚洲制服少妇| 亚洲二区精品| 欧美一区二区三区成人| 欧美日韩成人一区二区| 黄色日韩网站| 亚洲欧美一区二区在线观看| 欧美激情一区二区三区全黄| 亚洲专区免费| 欧美精品日韩一本| 怡红院精品视频| 午夜国产欧美理论在线播放| 亚洲国产综合91精品麻豆| 欧美一区二区三区男人的天堂| 欧美精选午夜久久久乱码6080| 国产一区二区三区日韩| 亚洲在线视频网站| 亚洲国产另类精品专区| 久久精品国产久精国产爱| 国产精品国产三级国产普通话99| 亚洲福利免费| 久久美女性网| 亚洲欧美日韩一区在线| 欧美日韩中文字幕综合视频| 亚洲欧洲在线观看| 久久青草久久| 午夜在线电影亚洲一区| 欧美图区在线视频| 99人久久精品视频最新地址| 毛片精品免费在线观看| 午夜在线精品| 国产精品日韩在线一区| 在线一区二区三区四区| 亚洲国产欧美另类丝袜| 久久久久一区| 激情欧美国产欧美| 久久久久久亚洲精品中文字幕 | 免费的成人av| 欧美一级理论性理论a| 国产精品日韩| 亚洲欧美在线aaa| 一区二区三区视频观看| 欧美日韩国产一区| 99精品国产高清一区二区| 欧美激情欧美狂野欧美精品| 久久在线精品| 亚洲福利免费| 欧美韩日精品| 免费不卡在线视频| 亚洲激情视频在线| 欧美国产乱视频| 久久久人成影片一区二区三区| 国产主播在线一区| 久久久久久久波多野高潮日日| 亚洲欧美色一区| 国产午夜精品全部视频播放| 久久国产精品99久久久久久老狼| 亚洲欧美视频一区| 国产一区视频网站| 狂野欧美一区| 久久综合给合| 亚洲精品在线观| 亚洲美女性视频| 欧美性天天影院| 欧美一区二区三区四区视频| 午夜精品www| 伊大人香蕉综合8在线视| 欧美mv日韩mv国产网站| 欧美高清你懂得| 这里只有精品在线播放| 亚洲午夜精品一区二区| 国产日韩欧美精品综合| 久久女同互慰一区二区三区| 久久综合网hezyo| 99xxxx成人网| 亚洲视频一区二区在线观看| 国产欧美日韩精品在线| 久热re这里精品视频在线6| 米奇777超碰欧美日韩亚洲| 99re在线精品| 亚洲免费视频网站| 伊人久久成人| 亚洲精品日韩激情在线电影| 国产精品久久久久久久久动漫| 久久精品视频播放| 欧美.日韩.国产.一区.二区| 亚洲图片在线| 久久成人资源| 999在线观看精品免费不卡网站| 一本色道精品久久一区二区三区| 国产日韩精品久久久| 美女性感视频久久久| 欧美日韩高清免费| 久久精彩视频| 欧美激情按摩在线| 欧美一区二区国产| 免费看的黄色欧美网站| 亚洲综合国产| 久久人人爽爽爽人久久久| 这里只有精品电影| 久久狠狠久久综合桃花| 日韩一二三区视频| 先锋亚洲精品| 日韩亚洲欧美一区| 欧美一区精品| 国产精品99久久99久久久二8 | 久久久亚洲精品一区二区三区| 欧美成人亚洲成人日韩成人| 欧美一区激情| 欧美精品www在线观看| 久久精品视频在线播放| 欧美日韩不卡合集视频| 久久综合久久综合这里只有精品| 欧美另类视频在线| 久久综合九九| 国产精品久久亚洲7777| 欧美激情导航| 国产在线高清精品| 夜夜爽夜夜爽精品视频| 亚洲成人在线免费| 亚洲一区精彩视频| 99国产麻豆精品| 久久久蜜臀国产一区二区| 亚洲欧美视频一区| 欧美激情综合五月色丁香| 老色鬼精品视频在线观看播放| 国产精品国产三级国产普通话三级| 欧美电影免费观看高清| 国产丝袜一区二区三区| 一本大道av伊人久久综合| 亚洲人成毛片在线播放| 久久精品人人做人人爽电影蜜月| 亚洲综合三区| 欧美日韩免费一区二区三区视频 | 欧美国产大片| 国产亚洲欧美另类一区二区三区| 日韩视频在线观看一区二区| 亚洲第一精品福利| 欧美一区激情视频在线观看| 午夜国产精品视频| 欧美日韩一二区| 亚洲欧洲日本在线| 亚洲国产欧美不卡在线观看| 久久精品电影| 久久久国产成人精品| 国产精品免费观看在线| 9l国产精品久久久久麻豆| 亚洲日本欧美天堂| 久久综合网hezyo| 美女脱光内衣内裤视频久久影院 | 精品成人一区二区三区| 午夜电影亚洲| 欧美在线二区| 国产欧美日韩视频一区二区| 亚洲一区日韩在线| 亚洲女同同性videoxma| 欧美特黄一区| 一区二区三区欧美激情| 中文在线不卡视频| 欧美日韩大陆在线| 亚洲理论在线观看| 99这里只有久久精品视频| 欧美国产专区| 亚洲日本中文字幕| 一区二区三区鲁丝不卡| 欧美日韩国产精品专区| 99精品久久久| 亚洲图片欧洲图片日韩av| 欧美手机在线视频| 宅男噜噜噜66一区二区66| 亚洲综合二区| 国产欧美精品日韩| 亚洲欧美一区二区三区久久| 欧美一区二区三区精品| 国产日韩在线不卡| 久久精品1区| 免费亚洲婷婷| 亚洲三级色网| 欧美日韩一级黄| 亚洲一区二区在线视频| 久久久99久久精品女同性| 樱桃国产成人精品视频| 欧美1区2区视频| 亚洲免费电影在线| 亚洲伊人一本大道中文字幕| 国产精品视频在线观看| 欧美在线网址| 亚洲第一在线综合网站| av成人激情| 国产精品成人av性教育|