• Using X++ code achieve numerals Convert to TXT String for Chinese


    Sometimes,We are have to real numerals convert to txt string.

    So I wrote a X++ Code achieve it.(AOT - > Classes - > Global - > Jimmy_numeralsToTxt_CN)

    parameter 1  (Real numerals)

    parameter 2  (Ture - > Simplified Chinese;    False - > Traditional Chinese)

    parameter 3  (Ture - > is Money;         False - > Real number)

    parameter 4  (Counter (StrLen(num2Str(parameter 16,1,1,1,1)))).

    Such as

    info( global::Jimmy_numeralsToTxt_CN(1285924.56,false,True,num2str(1285924.56,16,1,1,1)) )); //壹佰贰拾捌万伍仟玖佰贰拾肆圆伍角陆分 

     

    static TempStr Jimmy_numeralsToTxt_CN(RealBase _number ,
    NoYes _type ,
    NoYes _isMoney,
    Counter _numLen)
    {
    TempStr strNum[
    10];
    TempStr strUnit[
    16];
    TempStr strUnitB[
    2];
    TempStr strUnitC[
    6];

    TempStr result;
    TempStr strFirst;
    TempStr strEnd;

    Counter lngNumberLen;
    Counter lngI ;
    Counter lngJ ;
    Counter pos;

    TempStr strNumber;
    TempStr strTmp;

    #MacroLib.Num2Char_CN
    #define.DecimalPrecisionOfAmount(2)

    TempStr cutRightZero(TempStr _strNumber)
    {
    Counter tempLen;
    Counter i;
    TempStr tempStr;
    TempStr returnStr;

    ;
    tempLen
    = strlen(_strNumber);
    returnStr
    = _strNumber;
    for (i = tempLen; i >= 0; i--)
    {
    tempStr
    = strdel(returnStr, 1, i - 1);
    if (tempStr == #Decimal)
    {
    returnStr
    = strdel(returnStr, i, i);
    return returnStr;
    }
    else
    {
    if (tempStr == #Zero)
    {
    returnStr
    = strdel(returnStr, i, i - 1);
    }
    else
    {
    return returnStr;
    }
    }
    }
    return '';
    }

    TempStr decimalfraction2chinese(TempStr _strDecimal,NoYes _isMon)
    {
    Counter lntgJ;
    Counter decimalLen;
    TempStr tempEndstr;
    ;

    decimalLen
    = strlen(_strDecimal);

    for (lntgJ = decimalLen; lntgJ >=1; lntgJ--)
    {
    if (str2int(substr(_strDecimal, strlen(_strDecimal), -1)) == 0)
    {
    _strDecimal
    = substr(_strDecimal, 1, strlen(_strDecimal) - 1);
    }
    else
    {
    break;
    }
    }

    decimalLen
    = strlen(_strDecimal);
    tempEndstr
    = '' ;

    for (lntgJ = 1; lntgJ <= decimalLen; lntgJ++)
    {
    if (str2int(substr(_strDecimal, lntgJ, 1)) == 0)
    {
    if (_isMon == NoYes::No)
    {
    if (lntgJ == decimalLen)
    {
    tempEndstr
    = tempEndstr;
    }
    else
    {
    tempEndstr
    = tempEndstr + strNum[10];
    }
    }
    else
    {
    if (lntgJ == 1)
    {
    tempEndstr
    = tempEndstr + strNum[10]+strUnitB[1];
    }
    }
    }
    else
    {
    if (_isMon == NoYes::Yes)
    {
    tempEndstr
    = tempEndstr + strNum[str2int(substr(_strDecimal, lntgJ, 1))] + strUnitB[lntgJ];
    if (decimalLen == 1)
    {
    tempEndstr
    = tempEndstr + #Integer;
    }
    }
    else
    {
    tempEndstr
    = tempEndstr + strNum[str2int(substr(_strDecimal, lntgJ, 1))];
    }
    }
    }
    return tempEndstr;
    }

    Counter getDecimalLen(RealBase _numb, Counter _numL)
    {
    Counter lntgI;
    Counter decimalLen;
    TempStr lngTmp;

    ;

    lngTmp
    = strltrim(strrtrim(num2str(_numb, 10, #DecimalPrecisionOfAmount, 1, 0)));
    lntgI
    = strfind(lngTmp,#Decimal,1,strlen(lngTmp));
    decimalLen
    = _numL - lntgI;
    if (decimalLen < 0)
    {
    decimalLen
    = 0;
    }
    return decimalLen;
    }

    TempStr keep2digits(TempStr _strNumber)
    {
    Counter lntgI;
    Counter numberLen;
    TempStr strTemp;
    TempStr strDotAfter;
    ;

    numberLen
    = strlen(_strNumber);
    lntgI
    = strfind(_strNumber, #Decimal, 1, numberLen);
    if (lntgI)
    {
    strTemp
    = _strNumber + #Zeros;
    strDotAfter
    = substr(strTemp, lntgI + 1, str2int(#NumTwo));
    if (strDotAfter == #Zeros)
    {
    strTemp
    = substr(_strNumber, 1, lntgI-1);
    }
    else
    {
    strTemp
    = substr(strTemp, 1, lntgI + str2int(#NumTwo));
    }
    }
    return strltrim(strrtrim(strTemp));
    }

    TempStr number2Chinese(TempStr _strNumber)
    {
    Counter strNumberLen;
    Counter lntgI;
    Counter lntgJ;
    TempStr strTemp;
    TempStr resultNumber;
    ;

    resultNumber
    = '';

    strNumberLen
    =strlen(_strNumber);
    if (strNumberLen == 0)
    {
    return '';
    }
    else
    {
    lntgI
    = 1;
    for (lntgJ = strNumberLen; lntgJ >= 1; lntgJ--)
    {
    strTemp
    =substr(_strNumber, lntgJ, -1);
    if (strTemp == #Zero)
    {
    if (resultNumber != '')
    {
    if (substr(_strNumber,lntgJ+1,-1) != #Zero)
    {
    resultNumber
    = strNum[10] + resultNumber;
    }
    }
    }
    else
    {
    resultNumber
    = strNum[str2int(strTemp)] + strUnit[lntgI] + resultNumber;
    }

    lntgI
    = lntgI + 1;

    }
    }

    return resultNumber;
    }

    void setUnit(NoYes _istype)
    {
    if (_istype == NoYes::No)
    {
    strNum[
    1] = #Cone;
    strNum[
    2] = #Ctwo;
    strNum[
    3] = #Cthree;
    strNum[
    4] = #Cfour;
    strNum[
    5] = #Cfive;
    strNum[
    6] = #Csix;
    strNum[
    7] = #Cseven;
    strNum[
    8] = #Ceight;
    strNum[
    9] = #Cnine;
    strNum[
    10] = #Czero;

    strUnit[
    1] = '';
    strUnit[
    2] = #Cten;
    strUnit[
    3] = #Chundred;
    strUnit[
    4] = #Cthousand;
    }
    else if (_istype == NoYes::Yes)
    {

    strNum[
    1] = #Lone;
    strNum[
    2] = #Ltwo;
    strNum[
    3] = #Lthree;
    strNum[
    4] = #Lfour;
    strNum[
    5] = #Lfive;
    strNum[
    6] = #Lsix;
    strNum[
    7] = #Lseven;
    strNum[
    8] = #Leight;
    strNum[
    9] = #Lnine;
    strNum[
    10] = #Lzero;

    strUnit[
    1] = '';
    strUnit[
    2] = #Lten;
    strUnit[
    3] = #Lhundred;
    strUnit[
    4] = #Lthousand;

    }
    }

    void setUnitB(NoYes _isMony)
    {
    if (_isMony == NoYes::Yes)
    {
    strUnitB[
    1] = #Penny;
    strUnitB[
    2] = #Cent;
    }
    else
    {
    strUnitB[
    1] = '';
    strUnitB[
    2] = '';
    }
    }

    void setUnitC(NoYes _isMony, NoYes _istype)
    {
    if (_isMony == NoYes::Yes)
    {
    if (_istype == NoYes::No)
    {
    strUnitC[
    1] = #Cyuan;
    }
    else
    {
    strUnitC[
    1] = #Lyuan;
    }
    }
    else
    {
    strUnitC[
    1] = '';
    }
    strUnitC[
    2] = #CMillion;
    strUnitC[
    3] = #CBillion;
    strUnitC[
    4] = #CMillion;

    }
    ;

    if (_numLen > str2int(#NumSixteen))
    {
    warning(strfmt(
    "@GLS54781", #NumSixteen));
    return '';
    }


    setUnit(_type);
    setUnitB(_isMoney);
    setUnitC(_isMoney, _type);

    if (_isMoney == NoYes::Yes)
    {
    _number
    = round(_number, Currency::find(CompanyInfo::find().CurrencyCode).RoundOffAmount);
    }

    if (_number == 0)
    {
    if (_isMoney == NoYes::Yes)
    {
    result
    = strNum[10] + strUnitC[1] + #Integer;
    }
    else
    {
    result
    = strNum[10];
    }
    }
    else
    {
    strNumber
    = num2str(_number, str2int(#NumTen), getDecimalLen(_number, _numLen),1 ,0);
    strNumber
    = strltrim(strrtrim(strNumber));
    pos
    = strfind(strNumber, '.', 1, strlen(strNumber));
    if (pos != 0)
    {
    strNumber
    = cutRightZero(strNumber);
    }
    lngNumberLen
    = strlen(strNumber);
    lngI
    = strfind(strNumber, #Decimal, 1, lngNumberLen);
    if (_isMoney == NoYes::Yes)
    {
    if (!lngI)
    {
    strEnd
    = #Integer;
    }
    else
    {
    strEnd
    = '';
    strNumber
    = keep2digits(strNumber) ;
    }

    }
    else
    {
    if (!lngI)
    {
    strEnd
    = '';
    }
    else
    {
    strEnd
    = #Point;
    }
    }

    lngNumberLen
    = strlen(strNumber);

    if (substr(strNumber, 1,1) == #Minus)
    {
    strFirst
    = #Negative;
    strNumber
    = strdel(strNumber, 1, 1);
    lngNumberLen
    = lngNumberLen - 1;
    }
    else
    {
    strFirst
    = '';
    }

    lngI
    = strfind(strNumber, #Decimal, 1, lngNumberLen);

    if (lngI)
    {
    strTmp
    = substr(strNumber, lngI + 1, lngNumberLen);

    strEnd
    =strEnd + decimalfraction2chinese(strTmp, _isMoney);

    strNumber
    = substr(strNumber,1, lngI - 1);
    lngNumberLen
    = strlen(strNumber);
    }

    result
    = '';

    lngJ
    = lngNumberLen / str2int(#NumFour);

    if (lngJ * str2int(#NumFour) < lngNumberLen)
    {
    lngJ
    = lngJ + 1;
    }

    for (lngI = 0; lngI < lngJ; lngI++)
    {
    if (lngI != lngJ - 1)
    {
    result
    = number2Chinese(substr(strNumber, lngNumberLen - lngI * str2int(#NumFour), -str2int(#NumFour))) + strUnitC[lngI + 1] + result;

    }
    else
    {
    result
    = number2Chinese(substr(strNumber, 1, lngNumberLen - lngI * str2int(#NumFour))) + strUnitC[lngI + 1] + result;
    }


    }

    }

    result
    = strReplace(result, strUnitC[3] + strUnitC[2], strUnitC[3]);


    if ( result == strUnitC[1] && _isMoney == NoYes::Yes )
    {
    result
    = strNum[10] + result;
    }

    if ( strlen(result) == 0 && _isMoney == NoYes::No)
    {
    result
    = strNum[10] + result;
    }

    result
    = strFirst + result + strEnd;

    return result;
    }
  • 相关阅读:
    nyoj 110 剑客决斗
    nyoj 16 矩形嵌套
    nyoj 17 单调递增最长子序列
    nyoj 37 回文字符串
    nyoj 44 子串和
    nyoj 36 最长公共子序列
    使用Broadcast实现android组件之间的通信 分类: android 学习笔记 2015-07-09 14:16 110人阅读 评论(0) 收藏
    ubuntu中安装samba 分类: linux 学习笔记 ubuntu 2015-07-07 16:14 46人阅读 评论(0) 收藏
    ubuntu中安装eclipse 分类: android ubuntu linux 学习笔记 2015-07-07 10:19 75人阅读 评论(0) 收藏
    ubuntu中安装jdk 分类: java 学习笔记 linux ubuntu 2015-07-06 17:49 74人阅读 评论(0) 收藏
  • 原文地址:https://www.cnblogs.com/Fandyx/p/1974588.html
Copyright © 2020-2023  润新知