Wie alle Dezimalwert auf Nullen in XSL ändernWie alle Dezimalzahlen in Zeroes ändern XSL
Beispielwert:
aus: 9876,123
zu: 9876,000
Wie alle Dezimalwert auf Nullen in XSL ändernWie alle Dezimalzahlen in Zeroes ändern XSL
Beispielwert:
aus: 9876,123
zu: 9876,000
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
Danke, das ist sehr hilfreich. – Drew
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'))
ja das ist richtig !, danke, Aber die Nullen sind abhängig von der Länge der Dezimalstelle – Drew
Ich dachte, ich adressiert diese Anforderung auch. –
Das Beispiel ist mehrdeutig. Es wäre besser, die Logik in Worten zu erklären. –
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()? –
Meinst du 'Dezimalstellen'? – EJP