Witam
Jak zmienić kwotę napisana cyframi na słowa??
nie ma na to żadnej funkcji (albo ja nic o tym nie wiem :P)
musisz sobie napisać warunki albo case'y :) miłej zabawy :P
to już było - niekoniecznie w tym dziale, ale co to za różnica... poszukaj na forum.
możecie użyć mojej procedury w C++
namespace {
const char *slowa3c[][10] = {
{
"zero",
"jeden",
"dwa",
"trzy",
"cztery",
"pięć",
"sześć",
"siedem",
"osiem",
"dziewięć"},
{
"dziesięć",
"jedenaście",
"dwanaście",
"trzynaście",
"czternaście",
"piętnaście",
"szesnaście",
"siedemnaście",
"osiemnaście",
"dziewiętnaście"},
{
"dziesięć",
"dwadzieścia",
"trzydzieści",
"czterdzieści",
"pięćdziesiąt",
"sześćdziesiąt",
"siedemdziesiąt",
"osiemdziesiąt",
"dziewięćdziesiąt"},
{
"sto",
"dwieście",
"trzysta",
"czterysta",
"pięćset",
"sześćset",
"siedemset",
"osiemset",
"dziewięćset"}
};
const char *duzeLiczby[][3] = {
{"tysiąc","tysiące","tysięcy"},
{"milion","miliony","milionów"},
{"miliard","miliardy","miliardów"},
{"bilion","biliony","bilionów"}
};
string odmiana(const char **odmiany, int i) {
string txt = odmiany[2];
if (i == 1) txt = odmiany[0];
int jednosci = i%10;
int reszta = i % 100;
if ((jednosci > 1 && jednosci < 5) && !(reszta > 10 && reszta < 20))
txt = odmiany[1];
return txt;
}
string slownieLiczba3c(int i) {
string wynik = "";
if (i == 0) return slowa3c[0][0];
int jednosci = i % 10;
int dziesiatki = (i % 100 - jednosci) / 10;
int setki = (i - dziesiatki*10 - jednosci) / 100;
if (setki > 0) wynik += string(slowa3c[3][setki-1]) + " ";
if (dziesiatki > 0)
if (dziesiatki == 1) wynik += string(slowa3c[1][jednosci]) + " ";
else
wynik += string(slowa3c[2][dziesiatki-1]) + " ";
if (jednosci > 0 && dziesiatki != 1) wynik += string(slowa3c[0][jednosci]) + " ";
return wynik;
}
string slownie(int i){
if (i == 0) return string(slowa3c[0][0]);
string out;
int j = 0;
while (i>0) {
int liczba3c = i%1000;
if (j == 0) {
out = slownieLiczba3c(liczba3c);
} else {
if (liczba3c == 0) {
} else if (liczba3c == 1) {
out = odmiana(duzeLiczby[j-1], liczba3c) + " " + out;
} else {
out = slownieLiczba3c(liczba3c) + " " + odmiana(duzeLiczby[j-1], liczba3c) + " " + out;
}
}
j++;
i/=1000;
}
return out;
}
}
std::string kwotaSlownie(double liczba) {
int i = int(liczba * 100 + 0.5);
ostringstream o;
o << slownie(i/100) << " zł., " << (i%100) << " gr.";
return o.str();
}
// post troche spozniony,ale zostawiam, pewnie sie komuś przyda - Cold
PS. może umieściłbyś to w serwisie w C/FAQ?
Jeśli już umieszczać, to można by dodać przedstawianie dowolnej liczby (zmiennoprzecinkowej) za pomocą tekstu:
const char *maleLiczby[] = {
"dziesiątych",
"setnych",
"tysięcznych",
"dziesięciotysięcznych",
"stutysięcznych",
"milionowych",
"dziesięciomilionowych",
"stumilionowych",
"miliardowych",
"dziesięciomiliardowych",
"stumiliardowych"
}
std::string doubleSlownie(double liczba) {
int c = int(liczba);
ostringstream o;
o << slownie(c);
if (float u = (liczba - floor(liczba)) > 0) {
int x = -1;
float pom = u;
while (pom > floor(pom)) {
x++;
pom = pom*10;
}
o << " i " << slownie(int(pom)) << string(maleLiczby[x]);
}
return o.str();
}
Pisane z pamięci, ale chyba powinno działać ;)
joker999 GENIALNE! Tego wlasnie szukalem, dziekuje slicznie. [browar]
niewielki zabieg kosmetyczny i dopasowalem kod do swoich potrzeb.
jeszcze raz wielkie dzieki joker999 [!!!] :d
tak genialne [!!!]
po drobnych zmianach (java) działa super
:-)
tx
jedna uwaga tylko
do na prawdę duuuuuuuuużych liczb integer to za mało
w niektórych miejscach trzeba zmienic na long