Masz tu mój kod sprzed chyba 20 laty... :)
char *j[] = {"","jeden","dwa","trzy","cztery","pięć","sześć","siedem","osiem","dziewięć"},
*jn[]= {"dziesięć","jede","dwa","trzy","czter","pięt","szes","siedem","osiem","dziewięt"},
*Rz[]= {"bilion","miliard","milion","tysi", "złot", "grosz"};
void s3n(char *s, int a, int b, int c)
{
for(int p = 0; p < 3; p++)
{
if( p == 0 )
{
if( a > 2 ) { strcat(s, j[a]); strcat(s,(a < 5 ? "sta " : "set ")); }
else if( a > 0 ) strcat(s, a == 1 ? "sto " : "dwieście ");
}
else if( p == 1 )
{
if( b == 1 ) { strcat(s, jn[c]); strcat(s, (c ? "naście " : " ")); break; }
else if( b ) { strcat(s, (b==4?jn:j)[b]); strcat(s, b==2 ? "dzieścia " : b<5?"dzieści ": "dziesiąt "); }
}
else if( c ) { strcat(s, j[c]); strcat(s, " "); }
}
}
void slownie(char *s, double kw)
{
char str[48];
// s[0] = 0;
int i = sprintf(str, "%18.2f", kw);
if( i > 18 || i < 0 ) return;
for(i = 0; i < 15 && str[i] == ' '; i++) str[i] = '0';
if( str[i] == '-' ) str[i] = '0';
for(int n = 0, k = 0; k < 5+1; k++)
{
i = k*3;
int a = str[i]-'0', b = str[i+1]-'0', c = str[i+2]-'0';
if( k == 5 )
{
a = 0;
if( n && (b|c) ) strcat(s, " i ");
}
if( a|b|c || (n && k == 4) ) // 1'000 -> jeden tysiąc złotych (i a|b|c = 0 !)
{
n++;
s3n(s, a,b,c);
strcat(s, Rz[k]);
a = (c == 1 && !(a|b));
b = (c > 1 && c < 5 && b != 1);
if( k == 5 ) strcat(s,(b ? "e" : (a ? "" : "y" )));
else if( k == 4 ) strcat(s,(b ? "e" : (a ? "y" : "ych" )));
else if( k == 3 ) strcat(s,(b ? "ące " : (a ? "ąc " : "ęcy ")));
else strcat(s,(b ? "y " : (a ? " " : "ów " )));
}
}
}