نوشته شده توسط
Emir New
با تشکر از اقای بی نیاز
در مورد سوال دومم به جواب رسیدم ولی در مورد سوال اول من ابتدا جستجو زدم ولی چون به نتیجه ای نرسیدم این تاپیک رو ایجاد کردم
سلام
ميتوني از اين فانکشن استفاده کني
Example:
? numbertoc(500000)
FUNCTION numbertoc
PARAMETER number
PRIVATE number, sgn, len, unit, ;
lastunit, string, vav, ;
bignum1, bignum2, bignum3, ;
strs, loc, digit, sub
m.number = IIF(TYPE("M.Number") = ;
"N", ;
LTRIM(STR(m.number, ;
15)), m.number)
IF VAL(m.number) > ;
999999999999999 .OR. ;
VAL(m.number) < - ;
999999999999999
RETURN ("-1")
ENDIF
m.sgn = IIF(VAL(m.number) < 0, ;
"منفي ", "")
IF VAL(m.number) = 0
RETURN "صفر"
ENDIF
m.number = IIF(LEFT(m.number, 1) = ;
"-", SUBSTR(m.number, ;
2), m.number)
m.len = LEN(m.number)
STORE " " TO unit, lastunit
m.string = ""
m.vav = "و"
DIMENSION strs(3)
strs(1) = "يك دو سه چهار پنج شش هفت هشت نه ده يازده دوازده سيزده چهارده پانزده شانزده هفده هجده نوزده "
strs(2) = ;
"ده بيست سي چهل پنجاه شصت هفتاد هشتاد نود "
strs(3) = ;
"يكصد دويست سيصد چهارصد پانصد ششصد هفتصد هشتصد نهصد "
DO WHILE .T.
m.digit = VAL(LEFT(m.number, ;
1))
m.loc = MOD(m.len, 3)
IF m.loc = 2 .AND. m.digit = ;
1
m.digit = VAL(LEFT(m.number, ;
2))
m.loc = 1
ELSE
IF m.loc = 0
m.loc = 3
ENDIF
ENDIF
IF m.digit <> 0
DO CASE
CASE m.len > 3 ;
.AND. m.len < ;
7
m.unit = "هزار"
CASE m.len > 6 ;
.AND. m.len < ;
10
m.unit = "ميليون"
CASE m.len > 9 ;
.AND. m.len < ;
13
m.unit = "ميليارد"
CASE m.len > 12 ;
.AND. m.len < ;
16
m.unit = "تريليون"
ENDCASE
ENDIF
m.sub = IIF(m.digit <> 0, ;
ALLTRIM(SUBSTR(strs(m.loc), ;
(m.digit - 1) * 7 + ;
1, 7)), "")
m.len = m.len - ;
LEN(LTRIM(STR(m.digit)))
m.number = RIGHT(m.number, ;
m.len)
IF m.unit <> m.lastunit ;
.AND. ((m.loc = 1 .OR. ;
(m.loc = 3 .AND. ;
VAL(m.number) = 0)) .OR. ;
VAL(m.number) = 0)
m.sep = IIF(VAL(m.number) > ;
0, m.vav, "")
m.string = IIF(LEN(m.sub) = ;
0, ;
ALLTRIM(STRTRAN(m.string, ;
m.sep, "", ;
OCCURS(m.sep, ;
m.string), ;
1)), ;
ALLTRIM(m.string)) + ;
" " + m.sub + ;
" " + m.unit + ;
" " + m.sep
m.lastunit = m.unit
ELSE
m.sep = IIF(VAL(m.number) > ;
0 .AND. ;
LEN(m.sub) <> 0 ;
.AND. m.len > 0 ;
.AND. m.digit <> ;
0, m.vav, "")
m.string = ALLTRIM(ALLTRIM(m.string) + ;
" " + m.sub + ;
" " + ;
m.sep)
ENDIF
IF m.len <= 0 .OR. ;
VAL(m.number) = 0
RETURN m.sgn + ;
ALLTRIM(m.string)
ENDIF
ENDDO
RETURN m.string
ENDFUNC