Avatar billede dsborring Nybegynder
12. juni 2003 - 07:44 Der er 7 kommentarer og
1 løsning

Formatering af tal i MX

Er der nogen, der kan hjælpe med formattering af tal i Flash MX?

Jeg vil gerne have Flash til at skrive mine beregninger med 2 decimaler hele tiden. Og gerne med et komma i stedet for et punktum.

Lige nu skriver den fx '21' men jeg vil gerne have den til at skrive '21,00'.

Jeg har rigtig mange beregninger, så det vil være RIGTIG fedt, hvis løsningen kan implementeres sådan helt generelt.

Håber I kan hjælpe
Takker
Avatar billede barklund Nybegynder
12. juni 2003 - 09:58 #1
Du kan ikke gøre det helt automatisk for alle tal generelt. du kan dog lave en generel funktion, der konverterer alle reelle tal og heltal til "danske" komma-tal:

Math.convertToKroner = function(tal) {
    var integer = Math.floor(tal);
    var decimals = Math.round((tal-integer)*100)/100;
    var twoDecimals = (decimals+0.00001).toString().substring(2,4);
    return integer+","+twoDecimals;
}
trace(Math.convertToKroner(4.5));
trace(Math.convertToKroner(45));
trace(Math.convertToKroner(4.347));
trace(Math.convertToKroner(4.50001));

/Barklund
Avatar billede olebole Juniormester
13. juni 2003 - 04:32 #2
<ole>

Eller denne, hvor du også sætter tusind-punktum:

function millPoint( n ) {
    n=n.toString();
    for(var t="",i=0;n.length>3;t=(i!=0)?n.substring(n.length-3)+"."+t:n.substring(n.length-3),n=n.substring(0,n.length-3),i++);
    return n+=(n.length>0 && t.length>2)?"."+t:t;
}
Math.convertToKroner = function( n ) {
    n=''+Math.round(n*100);
    while (3>n.length) { n='0'+n; }
    var fKomma = n.substring(0,n.length-2);
    return millPoint(fKomma)+','+n.substring(n.length-2,n.length);
}
trace( Math.convertToKroner(123456789.987654) );

/mvh
</bole>
Avatar billede dsborring Nybegynder
13. juni 2003 - 16:05 #3
Tak til barklund - det virker!

Men det er nu en fræk detalje at smide et tusind-punktum ind. Men jeg kan ikke få det til at fungere:

Jeg får flg. fejlmeddelelse:

Scene=Scene 1, Layer=shopper totaler, Frame=40: Line 3: ':' expected
        for(var t="",i=0;n.length>3;t=(i!=0)?n.substring(n.length-3)+"."+t:n.substring(n.length-3),n=n.substring(0,n.length-3),i++);

Scene=Scene 1, Layer=shopper totaler, Frame=40: Line 4: ':' expected
        return n+=(n.length>0 && t.length>2)?"."+t:t;

Men jeg fatter ikke en bjælde af, hvad der er galt.
Håber du kan hjælpe!

Men nu har jeg jo fået 2 kvalificerede svar (forudsat at oleboles kommer til at virke), hvordan og hvem skal have point for svar???
Avatar billede olebole Juniormester
14. juni 2003 - 00:05 #4
Hmmmmm ..... der er stadig forskel på JavaScript - og JavaScript, som Flash vil ha' det  :)
Sådan fungerer det i hvert fald:

function millPoint( n ) {
    n=n.toString();
    for(var t="",i=0;n.length>3;i++) {
        if (i!=0) {
            t = n.substring(n.length-3)+"."+t;
        } else {
            t = n.substring(n.length-3);
    }
    n=n.substring(0,n.length-3)
}
    if (n.length>0 && t.length>2) {
        return n += "." + t;
    } else {
        return t;
    }
}
Math.convertToKroner = function( n ) {
    n=''+Math.round(n*100);
    while (3>n.length) { n='0'+n; }
    var fKomma = n.substring(0,n.length-2);
    return millPoint(fKomma)+','+n.substring(n.length-2,n.length);
}
trace( Math.convertToKroner(123456789.987654) );

/mvh
Avatar billede barklund Nybegynder
14. juni 2003 - 21:50 #5
Olebole >>

Når du bruger conditional ?:, så SKAL der mellemrum før ":" (hvis det er et variabelnavn før) - ellers tror flash det er et objekt-initialisering, altså:

var s1 = fjollet?t:p; // fejler
var s2 = fjollet?t :p; // ok

Derfor fejlen i din oprindelige funktion. En anden langt større fejl er dit scope. Din funktion "millpoint" er defineret på den sti, hvor scriptet skrives, mens funktionen på Math-objektet er global. Det vil betyde, at hvis man anvender Math.convertToKroner() på en anden tidslinie, så vil millPoint() ikke eksistere og heltals-delen af tallet forsvinder.

Her er mit bud udvidet med tusindtals-separator:

Math.convertToKroner = function(tal) {
    var integer = Math.floor(tal).toString();
    var decimals = Math.round((tal-integer)*100)/100;
    var twoDecimals = (decimals+0.0001).toString().substring(2,4);
    var i = integer.length;
    var j = -1, thousands = "";
    while((i-=3) > 0) {
        thousands = (i > 0 ? "." : "")+integer.substring(i,i+3)+thousands;   
    }
    return integer.substring(0,i+3)+thousands+","+twoDecimals;
}

trace(Math.convertToKroner(123456789.1234));
Avatar billede olebole Juniormester
14. juni 2003 - 23:31 #6
Doooohhhh ....... naturligvis! Ja, nu er der jo pludselig mange steder, tingene kan befinde sig. Det tager zq nok lige lidt tid, før det kommer rigtig ind i rutinen  :)

Tak, for rettelsen af if/else'en. Det er én af den slags ting, man skal vide. Det undrede mig da også, Flash ikke kunne håndtere den slags short-hands  ;o)
/mvh
Avatar billede dsborring Nybegynder
16. juni 2003 - 09:18 #7
Takker barklund

Det fungerer bare herre godt!
Avatar billede barklund Nybegynder
16. juni 2003 - 21:35 #8
Tark for points...
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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