Avatar billede nemitz Nybegynder
07. juli 2009 - 16:40 Der er 7 kommentarer og
1 løsning

Udskrive tal som tekst: 12 = Tolv, 103 = Ethundredeogtreogtredive

Hejsa Eksperter,

Her er en lille øvelse, jeg har fundet et script der udskriver tal som en tekst streng.
Jeg kunne rigtigt godt tænke mig at denne funktion kunne udskrive numrene på dansk.

Nogen der kan modificere den?

//http://javascript.internet.com/math-related/write-out-number.html
var n = "";
function convert(input) {
    n = "";
    var inputlength = input.length;
    var x = 0;
    var teen1 = "";
    var teen2 = "";
    var teen3 = "";
    var numName = "";
    var invalidNum = "";
    var a1 = ""; // for insertion of million, thousand, hundred
    var a2 = "";
    var a3 = "";
    var a4 = "";
    var a5 = "";
    digit = new Array(inputlength); // stores output
    for (i = 0; i < inputlength; i++)  {
    // puts digits into array
    digit[inputlength - i] = input.charAt(i)};
    store = new Array(9); // store output
    for (var i = 0; i < inputlength; i++) {
    x= inputlength - i;
    switch (x) { // assign text to each digit
    case x=9: d1(digit[x]); store[x] = n; break;
    case x=8: if (digit[x] == "1") {teen3 = "yes"}
              else {teen3 = ""}; d2(digit[x]); store[x] = n; break;
    case x=7: if (teen3 == "yes") {teen3 = ""; d3(digit[x])}
              else {d1(digit[x])}; store[x] = n; break;
    case x=6: d1(digit[x]); store[x] = n; break;
    case x=5: if (digit[x] == "1") {teen2 = "yes"}
              else {teen2 = ""}; d2(digit[x]); store[x] = n; break;
    case x=4: if (teen2 == "yes") {teen2 = ""; d3(digit[x])}   
              else {d1(digit[x])}; store[x] = n; break;
    case x=3: d1(digit[x]); store[x] = n; break;
    case x=2: if (digit[x] == "1") {teen1 = "yes"}
              else {teen1 = ""}; d2(digit[x]); store[x] = n; break;
    case x=1: if (teen1 == "yes") {teen1 = "";d3(digit[x])}   
              else {d1(digit[x])}; store[x] = n; break;
    }
    if (store[x] == "Not a Number"){invalidNum = "yes"};
    switch (inputlength){
    case 1:  store[2] = "";
    case 2:  store[3] = "";
    case 3:  store[4] = "";
    case 4:  store[5] = "";
    case 5:  store[6] = "";
    case 6:  store[7] = "";
    case 7:  store[8] = "";
    case 8:  store[9] = "";
    }
    if (store[9] != "") { a1 =" Hundred, "} else {a1 = ""};
    if ((store[9] != "")||(store[8] != "")||(store[7] != ""))
    { a2 =" Million, "} else {a2 = ""};
    if (store[6] != "") { a3 =" Hundred "} else {a3 = ""};
    if ((store[6] != "")||(store[5] != "")||(store[4] != ""))
    { a4 =" Thousand, "} else {a4 = ""};
    if (store[3] != "") { a5 =" Hundred "} else {a5 = ""};
    }
    // add up text, cancel if invalid input found
    if (invalidNum == "yes"){numName = "Invalid Input"}
    else {
    numName =  store[9] + a1 + store[8] + store[7]
    + a2 + store[6] + a3 + store[5] + store[4]
    + a4 + store[3] + a5 + store[2] + store[1];
    }
    store[1] = ""; store[2] = ""; store[3] = "";
    store[4] = ""; store[5] = ""; store[6] = "";
    store[7] = ""; store[8] = ""; store[9] = "";
    if (numName == ""){numName = "Zero"};
    //document.myform.textver.value = numName;
    return numName;
}

function d1(x) { // single digit terms
    switch(x) {
    case '0': n= ""; break;
    case '1': n= " One "; break;
    case '2': n= " Two "; break;
    case '3': n= " Three "; break;
    case '4': n= " Four "; break;
    case '5': n= " Five "; break;
    case '6': n= " Six "; break;
    case '7': n= " Seven "; break;
    case '8': n= " Eight "; break;
    case '9': n= " Nine "; break;
    default: n = "Not a Number";
    }
    return n;
}
function d2(x) { // 10x digit terms
    switch(x) {
    case '0': n= ""; break;
    case '1': n= ""; break;
    case '2': n= " Twenty "; break;
    case '3': n= " Thirty "; break;
    case '4': n= " Forty "; break;
    case '5': n= " Fifty "; break;
    case '6': n= " Sixty "; break;
    case '7': n= " Seventy "; break;
    case '8': n= " Eighty "; break;
    case '9': n= " Ninety "; break;
    default: n = "Not a Number";
    }
    return n;
}
function d3(x) { // teen digit terms
    switch(x) {
    case '0': n= " Ten "; break;
    case '1': n= " Eleven "; break;
    case '2': n= " Twelve "; break;
    case '3': n= " Thirteen "; break;
    case '4': n= " Fourteen "; break;
    case '5': n= " Fifteen "; break;
    case '6': n= " Sixteen "; break;
    case '7': n= " Seventeen "; break;
    case '8': n= " Eighteen "; break;
    case '9': n= " Nineteen "; break;
    default: n=  "Not a Number";
    }
    return n;
}
Avatar billede claes57 Ekspert
07. juli 2009 - 17:31 #1
dansk og fransk er noget kage til det - med mindre du kan bruge 'check-tal' som fx OtteTiNi osv...
Bare se hvor svært det er "103 = Ethundredeogtreogtredive"
Avatar billede nemitz Nybegynder
07. juli 2009 - 17:39 #2
Hehe, ja der skulle nok have stået 133 i topic.
Ja det er sgu noget bøvl, men kan jo være der er et skarpt hovede der lige kan se hvordan det kan gøres.
Avatar billede claes57 Ekspert
07. juli 2009 - 18:20 #3
jeg ser på det - bare tal er under 1 milliard (fordi op til og med millioner er vi enige med andre lande om navne).
Avatar billede majbom Novice
07. juli 2009 - 19:02 #4
det er jo nemt nok at oversætte det, men så vil du få tal som 127 = En hunrede tyve syv

så der skal tages højde for om der skal stå "en" eller "et" og der skal sættes og ind, hvis tallerkomme efter et andet osv. osv.

det er ikke bare sådan lige til, du kan jo se her:

www.majbom.com/testarea/exp/880240

skriv et tal (med tal) i feltet og tryk et vilkårligt sted på siden uden for feltet...
Avatar billede thesurfer Nybegynder
07. juli 2009 - 19:14 #5
Med hensyn til "127 = En hunrede tyve syv":

Her skal man teste om der på plads 1 fra højre (dvs "enere"), er en værdi der ikke er "0".

Hvis værdien ikke er "0", skal man bytte om på de to sidste ord, og smide et "og" ind i mellem..

120 = "et hundrede og tyve"

127 = "et hundrede og syv og tyve"
Avatar billede thesurfer Nybegynder
07. juli 2009 - 19:16 #6
PS:

Stavefejl i titlen på http://www.majbom.com/testarea/exp/880240

:-)
Avatar billede nemitz Nybegynder
07. juli 2009 - 20:59 #7
Det er jeg naturligvis med på, har også leget med det, men at få det rigtigt er jo hele øvelsen.
Avatar billede nemitz Nybegynder
07. juli 2009 - 23:00 #8
Nå jeg fandt et script der var lidt nemmere at forstå for mig.
Følgende kan udskrive danske tal som tekst, det kan sikkert gøres smukkere men det virker :-)

//http://www.merlyn.demon.co.uk/js-maths.htm#Cash
function numToText (a) {
    if (a == 0) {
        return "nul";
    }
    var numbers = ["", "et", "to", "tre", "fire", "fem", "seks", "syv", "otte", "ni", "ti", "elleve", "tolv", "tretten", "fjorten", "femten", "seksten", "sytten", "atten", "nitten" ];
    var bigger = [ "", "ti", "tyve", "tredive", "fyrre", "halvtreds", "tres", "halvfjerds", "firs", "halvfems" ];

    if ((a % 100) < 20) {
        text = numbers[a % 20];
    } else {
        text = "";
        if (a % 10) {
            if (a % 100) {
                if (a % 10 == 1) {
                    text = "en";
                } else {
                    text = numbers[a % 10];
                }
            }
        }
        if (text != "") {
            text += " og " + bigger[Math.floor(a/10) % 10];
        } else {
            text = bigger[Math.floor(a/10) % 10];
        }
    }
    b = Math.floor(a/100);
    if (b) {
        if (a % 100) {
            if (b % 10) {
                text = numbers[b % 10]+" hundrede og " + text;
            } else {
                text = numbers[b % 10]+" og " + text;
            }
        } else {
            if (b % 10) {
                text = numbers[b % 10]+" hundrede";
            }
        }
        if (b > 9) {
            if (a % 100)
            text = " "+text;
            text = numbers[Math.floor(b/10)]+" tusind" + text;
        }
    }
    return text;
}
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester