2016-06-02 5 views
0

Wie alle Dezimalwert auf Nullen in XSL ändernWie alle Dezimalzahlen in Zeroes ändern XSL

Beispielwert:

aus: 9876,123

zu: 9876,000

+2

Das Beispiel ist mehrdeutig. Es wäre besser, die Logik in Worten zu erklären. –

+0

Vereinbart mit @ michael.hor257k, wie viele Stellen rechts von der Dezimalstelle gibt es? Und wollen Sie immer die gleiche Anzahl von Nullen als Ziffern oder? Oder suchen Sie in Wirklichkeit nur die Funktion floor()? –

+0

Meinst du 'Dezimalstellen'? – EJP

Antwort

1

Falls die Anzahl der Stellen nach dem Komma im Voraus nicht bekannt ist, verwenden:

concat(substring-before(., '.'), 
     '.', 
     translate(substring-after(., '.'), '123456789', '000000000')) 

Dies ist die komplette XSLT-Transformation Beispiel:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

    <xsl:template match="d"> 
    <xsl:value-of select= 
     "concat(substring-before(., '.'), 
       '.', 
       translate(substring-after(.,'.'), '123456789','000000000'))"/> 
    </xsl:template> 
</xsl:stylesheet> 

Wenn diese Transformation angewendet wird über das folgende XML-Dokument:

<t> 
    <d>9876.1</d> 
    <d>9876.12</d> 
    <d>9876.123</d> 
    <d>9876.1234</d> 
    <d>9876.12345</d> 
    <d>9876.123456</d> 
    <d>9876.1234567</d> 
    <d>9876.12345678</d> 
    <d>9876.123456789</d> 
</t> 

das wollte, korrekte Ergebnis wird produziert:

9876.0 
    9876.00 
    9876.000 
    9876.0000 
    9876.00000 
    9876.000000 
    9876.0000000 
    9876.00000000 
    9876.000000000 

aktualisieren

Jemand, der Integer-Werte angefordert (nicht Dezimalpunkt) auch korrekt verarbeitet (kopiert intakt).

Ich fügte auch hinzu, dass negative Werte und/oder Währungsbezeichnungen auch korrekt verarbeitet werden sollten.

Obwohl dies außerhalb des Bereichs des aktuellen Problems liegt, hier ist wieder ein einziger XPath 1.0 Ausdruck, der das gewünschte Ergebnis produziert:

concat(substring-before(concat(., '.'), '.'), 
     translate(., '+-$', ''), 
     translate(substring-after(.,'.'), '123456789','000000000')) 

Und auch hier wieder ist die komplette Transformation:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

    <xsl:template match="d"> 
    <xsl:value-of select= 
    "concat(substring-before(concat(., '.'), '.'), 
      translate(., '+-$', ''), 
      translate(substring-after(.,'.'), '123456789','000000000'))"/> 
    </xsl:template> 
</xsl:stylesheet> 

Wenn diese Transformation auf das folgende XML-Dokument angewendet wird:

<t> 
    <d>-$1.234</d> 
    <d>-1.234</d> 
    <d>-.234</d> 
    <d>9876</d> 
    <d>9876.1</d> 
    <d>9876.12</d> 
    <d>9876.123</d> 
    <d>9876.1234</d> 
    <d>9876.12345</d> 
    <d>9876.123456</d> 
    <d>9876.1234567</d> 
    <d>9876.12345678</d> 
    <d>9876.123456789</d> 
</t> 

das gewünschte, korrekte Ergebnis ist zu produzieren d:

-$1.000 
    -1.000 
    -.000 
    9876 
    9876.0 
    9876.00 
    9876.000 
    9876.0000 
    9876.00000 
    9876.000000 
    9876.0000000 
    9876.00000000 
    9876.000000000 
+0

Danke, das ist sehr hilfreich. – Drew

4

Nun,

floor(9876.123) 

kehrt:

9876 

und:

format-number(floor(9876.123), '#.000') 

kehrt:

9876.000 

Ich sehe nicht, warum dies sinnvoll wäre, aber falls Sie die Anzahl der Dezimalstellen bewahren wollen Würde ich verwenden:

format-number(floor($amount), translate($amount, '123456789', '000000000')) 
+0

ja das ist richtig !, danke, Aber die Nullen sind abhängig von der Länge der Dezimalstelle – Drew

+0

Ich dachte, ich adressiert diese Anforderung auch. –