@echo off ::: ARGS: number [/trace] if (%1)==() goto help goto play :help echo Convert a number to words in russian echo Args are: number [/trace] echo number should be nonnegative integer echo /trace shows debug output goto :eof :play set TRACE=rem if (%2)==(/trace) set TRACE=echo %TRACE% %0 ( %* ) set /A v1=((%1) / 100000000) %% 10 set /A v2=((%1) / 10000000) %% 10 set /A v3=((%1) / 1000000) %% 10 set /A v4=((%1) / 100000) %% 10 set /A v5=((%1) / 10000) %% 10 set /A v6=((%1) / 1000) %% 10 set /A v7=((%1) / 100) %% 10 set /A v8=((%1) / 10) %% 10 set /A v9=((%1) / 1) %% 10 call :main %v1% %v2% %v3% %v4% %v5% %v6% %v7% %v8% %v9% echo %1 is %fullstr% goto :eof ::: print by 3 digit blocks, with names of these blocks ::: ARGS: sotni desiatki edinici :milliony %TRACE% %0 ( %* ) set result= if (%1%2%3)==(000) goto :eof call :wordize %1 %2 %3 m million milliona millionov %TRACE% %0 return result=(%result%) goto eof :tysiachi %TRACE% %0 ( %* ) set result= if (%1%2%3)==(000) goto :eof call :wordize %1 %2 %3 f tysiacha tysiachi tysiach %TRACE% %0 return result=(%result%) goto :eof :edinici %TRACE% %0 ( %* ) set result= if (%1%2%3)==(000) goto nol_shtuk call :wordize %1 %2 %3 f shtuka shtuki shtuk goto edinici_done :nol_shtuk set result=nol shtuk :edinici_done %TRACE% %0 return result=(%result%) goto :eof ::: print 3 digits ::: ARGS: sotni desiatki edinicy gender unit1 unit2 units :wordize echo %0 ( %* ) set result= :wordize_100 if (%1)==(0) goto wordize_10 call :select %1 _ sto dvesti trista chetyresta piatsot shestsot semsot vosemsot deviatsot set result=%selected% :wordize_10 if (%2)==(0) goto wordize_1 if (%2)==(1) goto wordize_11 call :select %2 _ desiat dvadcat tridcat sorok piatdesiat shestdesiat semdesiat vosemdesiat devianosto set result=%result% %selected% goto wordize_1 :wordize_11 call :select %3 desiat odinadcat dvenadcat trinadcat chetyrnadcat piatnadcat shestnadcat semnadcat vosemnadcat deviatnadcat set result=%result% %selected% goto wordize_units :wordize_1 if (%3)==(0) goto wordize_units goto wordize_1_%4 :wordize_1_m call :select %3 _ odin dva tri chetyre piat shest sem vosem deviat goto wordize_1_done :wordize_1_f call :select %3 _ odna dve tri chetyre piat shest sem vosem deviat :wordize_1_done set result=%result% %selected% :wordize_units if (%2)==(1) goto wordize_plural if (%3)==(1) goto wordize_singular if (%3)==(2) goto wordize_binary if (%3)==(3) goto wordize_binary if (%3)==(4) goto wordize_binary :wordize_plural set result=%result% %7 goto wordize_done :wordize_binary set result=%result% %6 goto wordize_done :wordize_singular set result=%result% %5 :wordize_done %TRACE% %0 return result=(%result%) goto :eof ::: select nth word ::: ARGS: index w0 w1 w2 w3 w4 w5 w6 w7 w8 w9 :select %TRACE% %0 ( %* ) set index=(%1) shift if %index%==(0) goto select_done shift if %index%==(1) goto select_done shift if %index%==(2) goto select_done shift if %index%==(3) goto select_done shift if %index%==(4) goto select_done shift if %index%==(5) goto select_done shift if %index%==(6) goto select_done shift if %index%==(7) goto select_done shift if %index%==(8) goto select_done shift :select_done set selected=%1 %TRACE% :select return selected=(%selected%) goto :eof ::: combines the full string of strings of 3-digit blocks ::: ARGS: 8th 7th 6th 5th 4th 3th 2nd 1st 0th (digits of a number) :main %TRACE% %0 ( %* ) set result= set fullstr= call :milliony %1 %2 %3 set fullstr=%result% call :tysiachi %4 %5 %6 set fullstr=%fullstr% %result% call :edinici %7 %8 %9 set fullstr=%fullstr% %result% %TRACE% %0 return fullstr=(%fullstr%) goto :eof