2012-10-08 21:55 UTC+0300 Pavel Tsarenko (tpe2 at mail.ru)

* contrib/hbmisc/numtxtru.prg
  * contrib/hbmisc/tests/numtxtru.prg
    * some fixes for unicode support
This commit is contained in:
Pavel Tsarenko
2012-10-08 18:59:09 +00:00
parent c20104e3b3
commit 6ba85d71df
3 changed files with 110 additions and 103 deletions

View File

@@ -16,6 +16,11 @@
The license applies to all entries newer than 2009-04-28.
*/
2012-10-08 21:55 UTC+0300 Pavel Tsarenko (tpe2 at mail.ru)
* contrib/hbmisc/numtxtru.prg
* contrib/hbmisc/tests/numtxtru.prg
* some fixes for unicode support
2012-10-08 20:04 UTC+0200 Viktor Szakats (harbour syenar.net)
* .gitattributes
! fixed the two attribute exceptions

View File

@@ -196,9 +196,9 @@ STATIC aUkr := { ;
"три", ;
"чотири", ;
"п'ять", ;
iсть", ;
"сiм", ;
iсiм", ;
ість", ;
"сім", ;
ісім", ;
"дев'ять", ;
"десять", ;
"одинадцять", ;
@@ -206,36 +206,36 @@ STATIC aUkr := { ;
"тринадцять", ;
"чотирнадцять", ;
"п'ятнадцять", ;
iстнадцять", ;
"сiмнадцять", ;
iсiмнадцять", ;
істнадцять", ;
"сімнадцять", ;
ісімнадцять", ;
"дев'ятнадцять", ;
"двадцять", ;
"тридцять", ;
"сорок", ;
"п'ятдесят", ;
iстдесят", ;
"сiмдесят", ;
iсiмдесят", ;
істдесят", ;
"сімдесят", ;
ісімдесят", ;
"дев'яносто", ;
"сто", ;
"двiстi", ;
"двісті", ;
"триста", ;
"чотириста", ;
"п'ятсот", ;
iстсот", ;
"сiмсот", ;
iсiмсот", ;
істсот", ;
"сімсот", ;
ісімсот", ;
"дев'ятсот" }, ;
{ "нуль", "одна", "двi" }, ;
{ "нуль", "одна", "дві" }, ;
{ "нуль", "одно" }, ;
{ "тисяча", "мiльон", "мiльярд", "трильон", "квадрильон" }, ;
{ "тисячi", "мiльона", "мiльярда", "трильона", "квадрильона" }, ;
{ "тисяч", "мiльонiв", "мiлльярдiв", "трильонiв", "квадрильонiв" }, ;
{ "тисяча", "мільон", "мільярд", "трильон", "квадрильон" }, ;
{ "тисячі", "мільона", "мільярда", "трильона", "квадрильона" }, ;
{ "тисяч", "мільонів", "мілльярдів", "трильонів", "квадрильонів" }, ;
{ "нульовий", ;
"перший", ;
"другий", ;
"третiй", ;
"третій", ;
"четвертий", ;
"п'ятий", ;
"шостий", ;
@@ -248,9 +248,9 @@ STATIC aUkr := { ;
"тринадцятий", ;
"чотирнадцятий", ;
"п'ятнадцятий", ;
iстнадцятий", ;
"сiмнадцятий", ;
iсiмнадцятий", ;
істнадцятий", ;
"сімнадцятий", ;
ісімнадцятий", ;
"дев'ятнадцятий", ;
"двадцятий", ;
"тридцятий", ;
@@ -258,7 +258,7 @@ STATIC aUkr := { ;
"п'ятидесятий", ;
"шестидесятий", ;
"семидесятий", ;
iсьмидесятий", ;
ісьмидесятий", ;
"дев'яностий", ;
"сотий", ;
"двухсотий", ;
@@ -267,9 +267,9 @@ STATIC aUkr := { ;
"п'ятисотий", ;
"шестисотий", ;
"семисотий", ;
iсiмсотий", ;
ісімсотий", ;
"дев'ятисотий", ;
"тисячний", "мiльонний", "мiльярдний", "трильонний", "квадрильонний" }, ;
"тисячний", "мільонний", "мільярдний", "трильонний", "квадрильонний" }, ;
{ "", ;
"", ;
"двух", ;
@@ -278,7 +278,7 @@ STATIC aUkr := { ;
"п'яти", ;
"шости", ;
"семи", ;
iсьми", ;
ісьми", ;
"дев'яти", ;
"десяти", ;
"одинадцяти", ;
@@ -286,9 +286,9 @@ STATIC aUkr := { ;
"тринадцяти", ;
"чотирнадцяти", ;
"п'ятнадцяти", ;
iстнадцяти", ;
"сiмнадцяти", ;
iсiмнадцяти", ;
істнадцяти", ;
"сімнадцяти", ;
ісімнадцяти", ;
"дев'ятнадцяти", ;
"двадцяти", ;
"тридцяти", ;
@@ -296,20 +296,20 @@ STATIC aUkr := { ;
"п'ятидесяти", ;
"шестидесяти", ;
"семидесяти", ;
iсьмидесяти", ;
ісьмидесяти", ;
"дев'яносто" }, ;
{ "iй", "я", "а", "е", "е" }, ;
{ NTSR_FEMA, "грн.", "гривня", "гривнi", "гривень" }, ;
{ NTSR_FEMA, "коп.", "копiйка", "копiйки", "копiйок" }, ;
iнус", ;
{ "сiчня", "лютого", "березня", "квiтня", "травня", "червня", ;
{ "ій", "я", "а", "е", "е" }, ;
{ NTSR_FEMA, "грн.", "гривня", "гривні", "гривень" }, ;
{ NTSR_FEMA, "коп.", "копійка", "копійки", "копійок" }, ;
інус", ;
{ "січня", "лютого", "березня", "квітня", "травня", "червня", ;
"липня", "серпня", "вересня", "жовтня", "листопада", "грудня" }, ;
{ "рiк", "року" } }
{ "рік", "року" } }
/* Belorussian messages */
STATIC aBel := { ;
{ "нуль", ;
"адзiн", ;
"адзін", ;
"два", ;
"тры", ;
"чатыры", ;
@@ -319,7 +319,7 @@ STATIC aBel := { ;
"восем", ;
"дзевяць", ;
"дзесяць", ;
"адзiнаццаць", ;
"адзінаццаць", ;
"дванаццаць", ;
"трынаццаць", ;
"чатырнаццаць", ;
@@ -347,13 +347,13 @@ STATIC aBel := { ;
"дзевяцьсот" }, ;
{ "нуль", "адна", "две" }, ;
{ "нуль", "адно" }, ;
{ "тысяча", "мiльён", "мiльярд", "трыльён", "квадрыльён" }, ;
{ "тысячы", "мiльёна", "мiльярда", "трыльёна", "квадрыльёна" }, ;
{ "тысяч", "мiльёнаў", "мiльярдаў", "трыльёнаў", "квадрыльёнаў" }, ;
{ "тысяча", "мільён", "мільярд", "трыльён", "квадрыльён" }, ;
{ "тысячы", "мільёна", "мільярда", "трыльёна", "квадрыльёна" }, ;
{ "тысяч", "мільёнаў", "мільярдаў", "трыльёнаў", "квадрыльёнаў" }, ;
{ "нулёвы", ;
"першы", ;
"другi", ;
"трэйцi", ;
"другі", ;
"трэйці", ;
"чацьверты", ;
"пяты", ;
"шосты", ;
@@ -361,7 +361,7 @@ STATIC aBel := { ;
"восьмы", ;
"дзявяты", ;
"дзясяты", ;
"адзiнаццаты", ;
"адзінаццаты", ;
"дванаццаты", ;
"трынаццаты", ;
"чатырнаццаты", ;
@@ -373,55 +373,55 @@ STATIC aBel := { ;
"дваццаты", ;
"трыццаты", ;
"саракавы", ;
"пяцiдзесяты", ;
"шасьцiдзясяты", ;
"сямiдзясяты", ;
"васьмiдзясяты", ;
"пяцідзесяты", ;
"шасьцідзясяты", ;
"сямідзясяты", ;
"васьмідзясяты", ;
"дзевяносты", ;
"соты", ;
"двухсоты", ;
"трохсоты", ;
"чатырохсоты", ;
"пяцiсоты", ;
"шасьцiсоты", ;
"сямiсоты", ;
"васьмiсоты", ;
"дзевяцiсоты", ;
"тысячны", "мiльённы", "мiльярдны", "трыльённы", "квадрыльённы" }, ;
"пяцісоты", ;
"шасьцісоты", ;
"сямісоты", ;
"васьмісоты", ;
"дзевяцісоты", ;
"тысячны", "мільённы", "мільярдны", "трыльённы", "квадрыльённы" }, ;
{ "", ;
"", ;
"двух", ;
"трах", ;
"чатырох", ;
"пяцi", ;
"шасцi", ;
"сямi", ;
"васьмi", ;
"дзевяцi", ;
"дзесяцi", ;
"адзiнаццацi", ;
"дванаццацi", ;
"трынаццацi", ;
"чатырнаццацi", ;
"пятнаццацi", ;
"шаснаццацi", ;
"сямнаццацi", ;
"васямнаццацi", ;
"дзевятнаццацi", ;
"дваццацi", ;
"трыццацi", ;
"пяці", ;
"шасці", ;
"сямі", ;
"васьмі", ;
"дзевяці", ;
"дзесяці", ;
"адзінаццаці", ;
"дванаццаці", ;
"трынаццаці", ;
"чатырнаццаці", ;
"пятнаццаці", ;
"шаснаццаці", ;
"сямнаццаці", ;
"васямнаццаці", ;
"дзевятнаццаці", ;
"дваццаці", ;
"трыццаці", ;
"сарака", ;
"пяцiцдзесяцi", ;
"шасцiдзесяцi", ;
"сямiдзесяцi", ;
"васьмiдзесяцi", ;
"пяціцдзесяці", ;
"шасцідзесяці", ;
"сямідзесяці", ;
"васьмідзесяці", ;
"дзевяноста" }, ;
{ "i", "яя", "ая", "яе", "ае" }, ;
{ NTSR_MALE, "руб.", "рубель", "рублi", "рублеў" }, ;
{ NTSR_FEMA, "коп.", "капейка", "капейкi", "капеек" }, ;
iнус", ;
{ "студзеня", "люты", "сакавiка", "красавiка", "мая", "чэрвеня", ;
iпеня", "жнiвеня", "верасня", "кастрычнiка", "лiстапада", "снежаня" }, ;
{ "і", "яя", "ая", "яе", "ае" }, ;
{ NTSR_MALE, "руб.", "рубель", "рублі", "рублеў" }, ;
{ NTSR_FEMA, "коп.", "капейка", "капейкі", "капеек" }, ;
інус", ;
{ "студзеня", "люты", "сакавіка", "красавіка", "мая", "чэрвеня", ;
іпеня", "жнівеня", "верасня", "кастрычніка", "лістапада", "снежаня" }, ;
{ "год", "года" } }
/*
@@ -437,7 +437,7 @@ FUNCTION NumToTxtRU( nValue, cLang, nGender, lOrd )
IF nValue < 0
nValue := -nValue
cRetVal := hb_UTF8ToStr( aMsg[ NTSR_MINUS ] ) + " "
cRetVal := aMsg[ NTSR_MINUS ] + " "
ELSE
cRetVal := ""
ENDIF
@@ -445,7 +445,7 @@ FUNCTION NumToTxtRU( nValue, cLang, nGender, lOrd )
nValue := Int( nValue )
cRetVal += NumToStrRaw( nValue, aMsg, nGender, lOrd )
RETURN cRetVal
RETURN hb_UTF8ToStr( cRetVal )
/*
* nValue: integer value;
@@ -466,10 +466,10 @@ FUNCTION MnyToTxtRU( nValue, cLang, nMode1, nMode2 )
nCent := Round( ( nValue - Int( nValue ) ) * 100, 0 )
nValue := Int( nValue )
cRetVal := MnyToStrRaw( nValue, cLang, hb_UTF8ToStr( aMsg[ NTSR_CURR ] ), nMode1 ) + " " + ;
MnyToStrRaw( nCent, cLang, hb_UTF8ToStr( aMsg[ NTSR_CENT ] ), nMode2 )
cRetVal := MnyToStrRaw( nValue, cLang, aMsg[ NTSR_CURR ], nMode1 ) + " " + ;
MnyToStrRaw( nCent, cLang, aMsg[ NTSR_CENT ], nMode2 )
RETURN cRetVal
RETURN hb_UTF8ToStr( cRetVal )
FUNCTION DateToTxtRU( dDate, cLang, lWord )
@@ -484,13 +484,13 @@ FUNCTION DateToTxtRU( dDate, cLang, lWord )
cRetVal := hb_ntos( nTemp )
ENDIF
cRetVal += " " + hb_UTF8ToStr( aMsg[ NTSR_MONTH, Month( dDate ) ] ) + " " + ;
Str( Year( dDate ), 4 ) + " " + hb_UTF8ToStr( aMsg[ NTSR_YEAR, 2 ] )
cRetVal += " " + aMsg[ NTSR_MONTH, Month( dDate ) ] + " " + ;
Str( Year( dDate ), 4 ) + " " + aMsg[ NTSR_YEAR, 2 ]
ELSE
cRetVal := ""
ENDIF
RETURN cRetVal
RETURN hb_UTF8ToStr( cRetVal )
STATIC FUNCTION MnyToStrRaw( nValue, cLang, aCur, nMode )
@@ -504,7 +504,7 @@ STATIC FUNCTION MnyToStrRaw( nValue, cLang, aCur, nMode )
ENDIF
IF nMode <= 2
IF nValue == 0
cRetVal := hb_UTF8ToStr( aMsg[ NTSR_MALE, 1 ] )
cRetVal := aMsg[ NTSR_MALE, 1 ]
ELSE
cRetVal := NumToStrRaw( nValue, aMsg, aCur[ 1 ] )
ENDIF
@@ -574,11 +574,11 @@ STATIC FUNCTION NumToStrRaw( nValue, aMsg, nGender, lOrd )
cTemp += " "
nTemp1 := ( nValue % 10 )
IF nTemp1 == 1 .AND. nValue != 11
cTemp += hb_UTF8ToStr( aMsg[ NTSR_1000_1, nTri ] )
cTemp += aMsg[ NTSR_1000_1, nTri ]
ELSEIF nTemp1 >= 2 .AND. nTemp1 <= 4 .AND. ( nValue < 10 .OR. nValue > 20 )
cTemp += hb_UTF8ToStr( aMsg[ NTSR_1000_2, nTri ] )
cTemp += aMsg[ NTSR_1000_2, nTri ]
ELSE
cTemp += hb_UTF8ToStr( aMsg[ NTSR_1000_3, nTri ] )
cTemp += aMsg[ NTSR_1000_3, nTri ]
ENDIF
ELSE
cTemp += "10**" + hb_ntos( nTri * 3 ) + " "
@@ -609,7 +609,7 @@ STATIC FUNCTION TriToStr( nValue, aMsg, nGender, lOrd, lLast, nTri )
ELSE
nIdx := NTSR_MALE
ENDIF
cRetVal := hb_UTF8ToStr( aMsg[ nIdx, Int( nValue / 100 ) + 28 ] )
cRetVal := aMsg[ nIdx, Int( nValue / 100 ) + 28 ]
IF nIdx == NTSR_CNT
cRetVal := OrdToGender( cRetVal, aMsg, nGender )
ENDIF
@@ -633,7 +633,7 @@ STATIC FUNCTION TriToStr( nValue, aMsg, nGender, lOrd, lLast, nTri )
nIdx := NTSR_ROD
lLast := .F.
ENDIF
cTemp := hb_UTF8ToStr( aMsg[ nIdx, Int( nValue / 10 ) - 1 + 20 ] )
cTemp := aMsg[ nIdx, Int( nValue / 10 ) - 1 + 20 ]
IF nIdx == NTSR_CNT
cTemp := OrdToGender( cTemp, aMsg, nGender )
ENDIF
@@ -661,7 +661,7 @@ STATIC FUNCTION TriToStr( nValue, aMsg, nGender, lOrd, lLast, nTri )
ELSE
nIdx := iif( nValue + 1 <= Len( aMsg[ nGender ] ), nGender, NTSR_MALE )
ENDIF
cTemp := hb_UTF8ToStr( aMsg[ nIdx, nValue + 1 ] )
cTemp := aMsg[ nIdx, nValue + 1 ]
IF nIdx == NTSR_CNT
cTemp := OrdToGender( cTemp, aMsg, nGender )
ENDIF
@@ -675,10 +675,10 @@ STATIC FUNCTION OrdToGender( cValue, aMsg, nGender )
LOCAL nTemp := Len( cValue ) - Len( aMsg[ NTSR_ORDG, 1 ] )
IF nGender == NTSR_FEMA
cValue := Left( cValue, nTemp ) + iif( SubStr( cValue, nTemp + 1 ) == hb_UTF8ToStr( aMsg[ NTSR_ORDG, 1 ] ), ;
cValue := Left( cValue, nTemp ) + iif( SubStr( cValue, nTemp + 1 ) == aMsg[ NTSR_ORDG, 1 ], ;
aMsg[ NTSR_ORDG, 2 ], aMsg[ NTSR_ORDG, 3 ] )
ELSEIF nGender == NTSR_MIDD
cValue := Left( cValue, nTemp ) + iif( SubStr( cValue, nTemp + 1 ) == hb_UTF8ToStr( aMsg[ NTSR_ORDG, 1 ] ), ;
cValue := Left( cValue, nTemp ) + iif( SubStr( cValue, nTemp + 1 ) == aMsg[ NTSR_ORDG, 1 ], ;
aMsg[ NTSR_ORDG, 4 ], aMsg[ NTSR_ORDG, 5 ] )
ENDIF

View File

@@ -2,10 +2,12 @@
* $Id$
*/
REQUEST HB_CODEPAGE_RU866
REQUEST HB_CODEPAGE_RU1251
PROCEDURE Main()
HB_CDPSelect( "RU1251" )
? "Press ESC to break"
? "Russian"
Test( "ru" )
@@ -16,11 +18,11 @@ PROCEDURE Main()
RETURN
PROCEDURE test( nLang )
PROCEDURE test( cLang )
LOCAL nTemp
dbCreate( "_num" + hb_ntos( nLang ), ;
dbCreate( "_num_" + cLang, ;
{ { "NUM" , "N", 19, 0 },;
{ "STR1", "C", 100, 0 },;
{ "STR2", "C", 100, 0 },;
@@ -28,9 +30,9 @@ PROCEDURE test( nLang )
FOR nTemp := 1 TO 1000000000
num->( dbAppend() )
num->Num := nTemp
num->Str1 := MnyToTxtRU( nTemp + ( nTemp % 100 ) * 0.01, nLang, , 3 )
num->Str2 := NumToTxtRU( nTemp, nLang, , .T. )
num->Str3 := DateToTxtRU( Date() + nTemp, nLang, .T. )
num->Str1 := MnyToTxtRU( nTemp + ( nTemp % 100 ) * 0.01, cLang, , 3 )
num->Str2 := NumToTxtRU( nTemp, cLang, , .T. )
num->Str3 := DateToTxtRU( Date() + nTemp, cLang, .T. )
IF nTemp % 1000 == 0
? nTemp
ENDIF