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;
}
posted @ 2011-03-07 15:40  Fandy Xie  Views(625)  Comments(0Edit  收藏  举报