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

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

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

TransNum.h 文件

#ifndef _TransNum_H_  
#define _TransNum_H_  
 
#include "KYLib.h"  
 
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  
 
/* 常量定義 */ 
 
// 轉換元素項(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           // 元素項個數  
 
// 擴充轉換元素項(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         // 擴充后元素項個數  
 
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  
 
/* 公用函數 */ 
 
// 轉換數字串為元素項列表  
// 參數:  
//    APos                 數字串的開始位置, 并返回結尾或非數字串  
//    AEnd                 數字串的結尾, 若為 NULL 則判斷'\0'結尾符號  
//    AElements            存放返回元素項列表, 不允許為 NULL  
//    AMaxSize             AElements 列表的最大尺寸  
// 返回值:  
//    > 0                  返回元素項個數  
//      0                  調用失敗, APos不是['0'..'9', '.', '-']開頭  
//     -1                  調用失敗, 參數不合法  
//     -2                  調用失敗, 元素列表的尺寸不足  
long     NumToElements(char* &APos, const char* AEnd, char* AElements, long AMaxSize);  
 
// 擴充為金額的元角分元素(注: AElements 的 MaxSize >= ACount + 2)  
long     ExtractYJFElements(char* AElements, long ACount);  
 
// 元素列表轉換成自定義字符串(ATEList 項數至少為 TEI_Count)  
KYString ElementsToCustom(const KYString* ATEList, const char* AElements, long ACount);  
 
// 元素列表轉換成數量讀法字符串  
KYString ElementsToQuantity(const char* AElements, long ACount);  
 
// 元素列表轉換成大寫金額字符串  
KYString ElementsToMoney(const char* AElements, long ACount);  
 
#endif 
#ifndef _TransNum_H_
#define _TransNum_H_

#include "KYLib.h"

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

/* 常量定義 */

// 轉換元素項(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           // 元素項個數

// 擴充轉換元素項(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         // 擴充后元素項個數

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

/* 公用函數 */

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

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

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

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

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

#endif

TransNum.cpp 文件

#include "TransNum.h"  
 
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  
 
/* 常量定義 */ 
 
// 數量元素列表  
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  
                        "佰",          // 百  
                        "仟",          // 千  
                        "萬",          // 萬  
                        "億",          // 億  
                        "點",          // 點  
                        "負",          // 負  
                        "元",          // 元  
                        "角",          // 角  
                        "分",          // 分  
                        "整"};         // 整  
 
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  
 
/* 內部函數 */ 
 
// 掃描數字串并清除左邊的'0'字符  
static long ScanDigitAndTrimLeft(char* &APos)  
{  
   // 過濾 '0' 字符  
   char* pBegin = APos;  
   while (*APos == '0')  
      APos++;  
 
   // 判斷前綴是否為 '0'  
   bool boolPrefix = (pBegin != APos);  
 
   // 繼續掃描  
   pBegin = APos;  
   while ((*APos >= '0') && (*APos <= '9'))  
      APos++;  
 
   // 計算長度  
   long result = APos - pBegin;  
   if (result == 0)  
      result = boolPrefix;  
 
   // 返回結果  
   return result;  
}  
 
// 掃描數字串并清除左邊的'0'字符  
static long ScanDigitAndTrimLeft(char* &APos, const char* AEnd)  
{  
   // 過濾 '0' 字符  
   char* pBegin = APos;  
   while ((APos < AEnd) && (*APos == '0'))  
      APos++;  
 
   // 判斷前綴是否為 '0'  
   bool boolPrefix = (pBegin != APos);  
 
   // 繼續掃描  
   pBegin = APos;  
   while ((APos < AEnd) && (*APos >= '0') && (*APos <= '9'))  
      APos++;  
 
   // 計算長度  
   long result = APos - pBegin;  
   if (result == 0)  
      result = boolPrefix;  
 
   // 返回結果  
   return result;  
}  
 
// 掃描數字串并清除右邊的'0'字符  
static long ScanDigitAndTrimRight(char* &APos)  
{  
   // 初始化  
   char* pBegin   = APos;  
   char* pLast    = APos;  
 
   // 循環掃描  
   while ((*APos >= '0') && (*APos <= '9'))  
   {  
      if (*APos != '0')  
         pLast = APos + 1;  
 
      APos++;  
   }  
 
   // 返回結果  
   return (pLast - pBegin);  
}  
 
// 掃描數字串并清除右邊的'0'字符  
static long ScanDigitAndTrimRight(char* &APos, const char* AEnd)  
{  
   // 初始化  
   char* pBegin   = APos;  
   char* pLast    = APos;  
 
   // 循環掃描  
   while ((APos < AEnd) && (*APos >= '0') && (*APos <= '9'))  
   {  
      if (*APos != '0')  
         pLast = APos + 1;  
 
      APos++;  
   }  
 
   // 返回結果  
   return (pLast - pBegin);  
}  
 
// 4位數轉換并返回元素項個數  
static long Digit4ToElements(char* &ADigit, char ANum, char* &AElement,  
                                     const char* AEnd, bool& AIsOverflow)  
{  
   // 靜態常量  
   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;  
 
   // 循環計算  
   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;  
            }  
         }  
      }  
   }  
 
   // 返回結果  
   return (AElement - pBegin);  
}  
 
// 8位數轉換并返回元素項個數  
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;  
   }  
}  
 
// 多位數轉換并返回元素項個數  
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;  
 
      // 循環處理  
      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--;  
         }  
      }  
 
      // 返回結果  
      return result;  
   }  
}  
 
// 小數點之后的數字轉換并返回元素項個數  
static long DecimalToElements(char* ADecimal, long ANum, char* &AElement,  
                                       const char* AEnd, bool& AIsOverflow)  
{  
   if (AElement <= AEnd - ANum)  
   {  
      // 循環轉換  
      for (long intNo = 0; intNo < ANum; intNo++, ADecimal++, AElement++)  
         *AElement = *ADecimal - '0';  
 
      // 返回結果  
      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;  
   }  
}  
 
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  
 
/* 公用函數 */ 
 
// 轉換數字串為元素項列表  
// 參數:  
//    APos                 數字串的開始位置, 并返回結尾或非數字串  
//    AEnd                 數字串的結尾, 若為 NULL 則判斷'\0'結尾符號  
//    AElements            存放返回元素項列表, 不允許為 NULL  
//    AMaxSize             AElements 列表的最大尺寸  
// 返回值:  
//    > 0                  返回元素項個數  
//      0                  調用失敗, APos不是['0'..'9', '.', '-']開頭  
//     -1                  調用失敗, 參數不合法  
//     -2                  調用失敗, 元素列表的尺寸不足  
long NumToElements(char* &APos, const char* AEnd, char* AElements, long AMaxSize)  
{  
   // 檢查參數是否非法  
   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'字符結尾  
   if (AEnd == NULL)  
   {  
      // 掃描左邊數字串  
      intLeft = ScanDigitAndTrimLeft(APos);  
      if (intLeft > 0)  
      {  
         pLeft    = APos - intLeft;  
         intLeft  = DigitsToElements(pLeft, intLeft, AElements,  
                                     pElementEnd, boolOverflow);  
         result  += intLeft;  
      }  
 
      // 檢查是否溢出, 并判斷是否存在小數點  
      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 
   {  
      // 掃描左邊數字串  
      intLeft = ScanDigitAndTrimLeft(APos, AEnd);  
      if (intLeft > 0)  
      {  
         pLeft    = APos - intLeft;  
         intLeft  = DigitsToElements(pLeft, intLeft, AElements,  
                                     pElementEnd, boolOverflow);  
         result  += intLeft;  
      }  
 
      // 檢查是否溢出, 并判斷是否存在小數點  
      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;  
   }  
 
   // 返回結果  
   return result;  
}  
 
// 擴充為金額的元角分元素(注: AElements 的 MaxSize >= ACount + 2)  
long ExtractYJFElements(char* AElements, long ACount)  
{  
   // 查找小數點  
   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++;  
 
   // 判斷是否存在小數點  
   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++;  
   }  
 
   // 返回結果  
   return result;  
}  
 
// 元素列表轉換成自定義字符串(ATEList 項數至少為 TEI_Count)  
KYString ElementsToCustom(const KYString* ATEList, const char* AElements, long ACount)  
{  
   // 初始化  
   KYString result;  
 
   // 檢查參數  
   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();  
 
      // 分配內存并拷貝數據  
      result.SetLength(intSize);  
      pPos     = (char*)result;  
      pElement = (char*)AElements;  
      for (intNo = 0; intNo < ACount; intNo++, pElement++)  
         CopyString(pPos, ATEList[*pElement]);  
   }  
 
   // 返回結果  
   return result;  
}  
 
// 元素列表轉換成數量讀法字符串  
KYString ElementsToQuantity(const char* AElements, long ACount)  
{  
   return ElementsToCustom(_TE_Quanitys, AElements, ACount);  
}  
 
// 元素列表轉換成大寫金額字符串  
KYString ElementsToMoney(const char* AElements, long ACount)  
{  
   return ElementsToCustom(_TE_Moneys, AElements, ACount);  

#include "TransNum.h"

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

/* 常量定義 */

// 數量元素列表
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
                        "佰",          // 百
                        "仟",          // 千
                        "萬",          // 萬
                        "億",          // 億
                        "點",          // 點
                        "負",          // 負
                        "元",          // 元
                        "角",          // 角
                        "分",          // 分
                        "整"};         // 整

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

/* 內部函數 */

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

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

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

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

   // 返回結果
   return result;
}

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

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

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

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

   // 返回結果
   return result;
}

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

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

      APos++;
   }

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

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

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

      APos++;
   }

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

// 4位數轉換并返回元素項個數
static long Digit4ToElements(char* &ADigit, char ANum, char* &AElement,
                                     const char* AEnd, bool& AIsOverflow)
{
   // 靜態常量
   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;

   // 循環計算
   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;
            }
         }
      }
   }

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

// 8位數轉換并返回元素項個數
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;
   }
}

// 多位數轉換并返回元素項個數
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;

      // 循環處理
      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--;
         }
      }

      // 返回結果
      return result;
   }
}

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

      // 返回結果
      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;
   }
}

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

/* 公用函數 */

// 轉換數字串為元素項列表
// 參數:
//    APos                 數字串的開始位置, 并返回結尾或非數字串
//    AEnd                 數字串的結尾, 若為 NULL 則判斷'\0'結尾符號
//    AElements            存放返回元素項列表, 不允許為 NULL
//    AMaxSize             AElements 列表的最大尺寸
// 返回值:
//    > 0                  返回元素項個數
//      0                  調用失敗, APos不是['0'..'9', '.', '-']開頭
//     -1                  調用失敗, 參數不合法
//     -2                  調用失敗, 元素列表的尺寸不足
long NumToElements(char* &APos, const char* AEnd, char* AElements, long AMaxSize)
{
   // 檢查參數是否非法
   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'字符結尾
   if (AEnd == NULL)
   {
      // 掃描左邊數字串
      intLeft = ScanDigitAndTrimLeft(APos);
      if (intLeft > 0)
      {
         pLeft    = APos - intLeft;
         intLeft  = DigitsToElements(pLeft, intLeft, AElements,
                                     pElementEnd, boolOverflow);
         result  += intLeft;
      }

      // 檢查是否溢出, 并判斷是否存在小數點
      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
   {
      // 掃描左邊數字串
      intLeft = ScanDigitAndTrimLeft(APos, AEnd);
      if (intLeft > 0)
      {
         pLeft    = APos - intLeft;
         intLeft  = DigitsToElements(pLeft, intLeft, AElements,
                                     pElementEnd, boolOverflow);
         result  += intLeft;
      }

      // 檢查是否溢出, 并判斷是否存在小數點
      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;
   }

   // 返回結果
   return result;
}

// 擴充為金額的元角分元素(注: AElements 的 MaxSize >= ACount + 2)
long ExtractYJFElements(char* AElements, long ACount)
{
   // 查找小數點
   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++;

   // 判斷是否存在小數點
   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++;
   }

   // 返回結果
   return result;
}

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

   // 檢查參數
   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();

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

   // 返回結果
   return result;
}

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

// 元素列表轉換成大寫金額字符串
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,"};       // 整  
 
// 輸出轉換結果  
static void OutputTransResult(TKYDebugFile& AFile, const KYString& AValue)  
{  
   // 靜態常量  
   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;  
 
   // 分配元素列表緩沖區  
   intLen = AValue.Length();  
   strElements.SetLength(intLen + intLen);  
   pElements = (char*)strElements;  
 
   // 轉換數字串為元素項列表  
   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());  
 
   // 若轉換元素表成功則輸出  
   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);  
   }  
 
   // 結束  
   AFile.Write(Log_Line);  
}  
 
// 主函數  
int main(int argc, char* argv[])  
{  
   // 靜態常量  
   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);  
 
      // 循環輸出  
      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,"};       // 整

// 輸出轉換結果
static void OutputTransResult(TKYDebugFile& AFile, const KYString& AValue)
{
   // 靜態常量
   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;

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

   // 轉換數字串為元素項列表
   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());

   // 若轉換元素表成功則輸出
   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);
   }

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

// 主函數
int main(int argc, char* argv[])
{
   // 靜態常量
   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);

      // 循環輸出
      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;
}


測試例子結果:

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博客,轉載請標明出處:http://blog.csdn.net/kyee/archive/2009/11/07/4783425.aspx

posted on 2011-05-22 12:51 Kyee Ye 閱讀(264) 評論(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>
            亚洲图片欧美一区| 国产精品成av人在线视午夜片| 欧美激情国产日韩精品一区18| 国产情人节一区| 久久精品国产69国产精品亚洲| 亚洲欧美日韩一区在线| 国产女主播视频一区二区| 久久国内精品自在自线400部| 欧美在线视频一区二区三区| 狠狠色综合色综合网络| 免费毛片一区二区三区久久久| 美国十次成人| 亚洲网在线观看| 亚洲欧美另类在线观看| 国产在线欧美| 欧美激情亚洲自拍| 欧美色播在线播放| 久久久欧美精品| 欧美xxx成人| 亚洲欧美经典视频| 久久久久久久综合日本| 一本色道**综合亚洲精品蜜桃冫 | 猛干欧美女孩| 欧美美女bb生活片| 久久国产日本精品| 欧美精品亚洲二区| 久久精品日韩欧美| 欧美日本国产视频| 久久九九99| 欧美三级电影大全| 欧美成人四级电影| 国产精品欧美在线| 欧美国产大片| 国产日韩亚洲欧美精品| 亚洲精品老司机| 欧美午夜精品久久久久久孕妇| 久久美女性网| 国产精品都在这里| 亚洲观看高清完整版在线观看| 国产精品一区在线观看你懂的| 亚洲国产三级| 极品尤物av久久免费看| 亚洲一区二区三区免费观看| 亚洲精品久久7777| 久久久之久亚州精品露出| 亚洲午夜高清视频| 免费视频亚洲| 麻豆成人av| 国产一区二区精品| 亚洲亚洲精品三区日韩精品在线视频| 亚洲欧洲精品一区二区| 久久福利毛片| 欧美有码视频| 国产精品免费一区豆花| 最近中文字幕mv在线一区二区三区四区 | 日韩一区二区精品视频| 亚洲国产岛国毛片在线| 欧美专区在线观看| 欧美制服丝袜| 国产乱码精品一区二区三区av| 亚洲免费久久| 一区二区三欧美| 欧美丰满高潮xxxx喷水动漫| 欧美不卡激情三级在线观看| 一区二区三区中文在线观看| 久久久国产亚洲精品| 快射av在线播放一区| 黄网动漫久久久| 久久视频国产精品免费视频在线 | 99天天综合性| 欧美日韩国产一区精品一区| 日韩视频一区二区三区在线播放 | 好吊视频一区二区三区四区| 久久精品成人一区二区三区| 久久久久久久久岛国免费| 国产有码在线一区二区视频| 欧美在线亚洲综合一区| 噜噜噜噜噜久久久久久91| **欧美日韩vr在线| 欧美黄色aaaa| 一区二区三区视频在线播放| 亚洲欧美文学| 国产一区二区三区高清播放| 久久国产精品第一页| 麻豆久久久9性大片| 亚洲国产精品一区二区第四页av| 久久一二三四| 亚洲精品专区| 亚洲欧美日韩一区二区在线| 国产视频精品网| 另类尿喷潮videofree| 91久久线看在观草草青青| 亚洲性视频h| 国产精品一区二区视频| 久久久精品网| 亚洲精品久久久久中文字幕欢迎你| 一区二区三区日韩在线观看| 国产精品欧美久久久久无广告| 欧美伊久线香蕉线新在线| 免费欧美电影| 亚洲欧美日韩成人| 在线观看的日韩av| 欧美色图五月天| 欧美在线日韩在线| 亚洲三级影院| 久久网站热最新地址| 日韩一级网站| 国内精品伊人久久久久av一坑| 欧美高清视频在线观看| 亚洲欧美美女| 亚洲三级色网| 久久这里有精品视频| 亚洲一区二区在线播放| 伊人伊人伊人久久| 国产精品视频99| 欧美福利视频在线| 久久不射电影网| 一区二区三区国产精品| 欧美69视频| 久久久999精品视频| 这里只有精品丝袜| 亚洲福利国产| 国产一区二区三区免费观看| 欧美日本一区| 暖暖成人免费视频| 久久aⅴ国产欧美74aaa| 亚洲网站在线| 夜夜精品视频| 亚洲理论在线观看| 亚洲国产另类久久久精品极度 | 亚洲国产一区二区三区青草影视| 国产精品亚洲一区二区三区在线| 欧美日韩 国产精品| 裸体歌舞表演一区二区 | 亚洲三级电影全部在线观看高清| 久久久水蜜桃| 久久精品国产第一区二区三区最新章节| 亚洲免费大片| 日韩视频第一页| 91久久精品久久国产性色也91| 黄色成人av网| 极品少妇一区二区三区| 国内精品久久久| 国产一区再线| 好看的日韩av电影| 激情综合久久| 亚洲动漫精品| 亚洲人成精品久久久久| 亚洲激情综合| 亚洲精品美女在线观看| 99国内精品久久| 亚洲香蕉网站| 欧美在线观看天堂一区二区三区| 欧美一区激情视频在线观看| 欧美在线观看视频在线| 久久一区免费| 亚洲福利一区| 99国产精品久久| 亚洲欧美欧美一区二区三区| 欧美亚洲色图校园春色| 久久精品亚洲一区| 欧美成人综合一区| 国产精品v一区二区三区| 国产美女精品视频| 黄色日韩网站视频| 亚洲免费av电影| 亚洲一区二区三区在线看| 午夜在线观看免费一区| 久久精品国产亚洲精品| 免费在线亚洲欧美| 亚洲日韩中文字幕在线播放| 亚洲香蕉网站| 久久久久国产精品一区| 欧美激情国产高清| 国产麻豆91精品| 亚洲高清资源| 亚洲在线观看| 久色婷婷小香蕉久久| 亚洲另类自拍| 欧美在线免费观看| 欧美日韩国产bt| 韩国美女久久| 亚洲私人影院在线观看| 久久夜色精品国产欧美乱极品| 亚洲国产欧美一区二区三区同亚洲| 亚洲精品午夜| 欧美一区二区在线看| 欧美精品18videos性欧美| 国产精品综合| 亚洲美女色禁图| 久久精彩视频| 99精品国产热久久91蜜凸| 欧美有码视频| 国产精品激情| 亚洲精品视频在线| 久久先锋影音av| 亚洲在线观看免费| 欧美日韩国产麻豆| 亚洲黄色在线视频| 久久影视精品|