[PHP]Kwota słownie

0

Witam
Jak zmienić kwotę napisana cyframi na słowa??

0

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

0

to już było - niekoniecznie w tym dziale, ale co to za różnica... poszukaj na forum.

0

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?

0

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ć ;)

0

joker999 GENIALNE! Tego wlasnie szukalem, dziekuje slicznie. [browar]
niewielki zabieg kosmetyczny i dopasowalem kod do swoich potrzeb.
jeszcze raz wielkie dzieki joker999 [!!!] :d

0

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1