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;
}