Toon posts:

[xslt] order van een getal bepalen

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik wil graag de orde van een getal bepalen, bijvoorbeeld

124 -> orde 2
3 -> orde 0
0.006 -> orde -3
34532.3453 -> orde 4


etc

normala gesproken zou je de logarithme (10 log) van zo'n getal nemen en dan het resultaat naar beneden afronden, in js:
JavaScript:
1
var order = Math.floor(Math.log(number)/Math.LN10)

(delen door ln 10 omdat met log eigenlijk de ln wordt uitgerekend)

maar goed, tot zover de theorie :) de rpaktijk is dat ik dit in een XSL sheet wil doen en de XPath functies zijn helaas wat beperkt (je hebt eigenlijk alleen maar absolute waarde en allerlei afrond functies)

Nu heb ik voor gehele getallen al het volgende bedacht:
code:
1
string-length(string(abs($number)))-1

lekker simpel, gewoon het aantal cijfers tellen (na evt de - te hebben weggemikt) en er 1 vanaf halen.

maar hoe ga ik dit nu aanpakken met cijfers met een comma (punt in dit geval) erin? als er iets voor de comma staat, anders dan 0, dan bepaald dat getal de orde, en anders moet je dus nullen gaan tellen. Iemand een briljante ingeving hoe ik dit snel kan bepalen? Ben op zoek naar een beetje korte code, want met if statements ben ik in xsl al rap enorme lappe code kwijt.

de xsl tot nu toe:
code:
1
2
3
4
5
6
7
8
9
10
11
<xsl:template name="math:order">
    <xsl:param name="number" />
    <xsl:choose>
        <xsl:when test="contains(string($number), '.')">
<!-- tja...-->
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="string-length(string(abs($number)))-1"/>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

[ Voor 14% gewijzigd door Verwijderd op 02-03-2006 20:07 ]


Verwijderd

Ik weet niet erg veel van XPath dus een code kan ik je niet geven.

Maar kan je niet telkens * 10 doen totdat het groter is dan 1,
en die uitkomst dan delen door het oude getal en van de uitkomst daarvan de string.length-1 opvragen.
En dan moet er nog een '-' voor.

ter verduidelijking (even in javascript)
code:
1
while(getal < 1) getal = getal * 10;
Dat dus in xpath ;)
en dan
code:
1
string-length(string( $getal / $oorspronkelijkegetal ))-1
En dan moet er nog een '-' voor ook nog.

Hoop dat je er iets aan hebt, zo niet, dan zou iemand anders je moeten helpen. :D