# Beträge konvertieren



## CelikBlek (15. Mrz 2006)

Hallo,

kann mir jemand sagen wie ich Beträge wie z.B 2303390.20 in 2.303.390,20 konvertieren kann?
umgekehrt habe ich es  geschafft, aber das bekomme ich nicht hin.

vielen Dank.


----------



## byte (15. Mrz 2006)

Das geht mit der Funktion: 
	
	
	
	





```
format-number(zahl, pattern, decimal-format)
```

zahl ist die zu formatierende Zahl, pattern ist wie in DecimalFormat von Java beschrieben und decimal-format ist optional, entweder das standard-format oder man setzt ein neues mit:


```
<xsl:decimal-format ... />

Snip:

<  decimal-format
   name= qname
   decimal-separator= char
   grouping-separator= char
   infinity= string
   minus-sign= char
   NaN= string
   percent= char
   per-mille= char
   zero-digit= char
   digit= char
   pattern-separator= char >
   <-- Content: -->
< /decimal-format>
```


----------



## CelikBlek (15. Mrz 2006)

könntest du mir das genauer zeigen bitte. angenommen ich habe eigenes template für:

```
<xsl:template name="konvertBetrag2">
   <xsl:param name="betrag"/>
   <xsl:value-of select="format-number($betrag, pattern, decimal-format)"/>
</xsl:template>
```
Der bekommt nur den betrag übergeben. Woher bekomme ich pattern und decimal-format?


----------



## CelikBlek (15. Mrz 2006)

spontan hätte ich es so gemacht, aber das geht net.

```
<xsl:value-of select='format-number($betrag, "###.###,00")'/>
```


----------



## CelikBlek (15. Mrz 2006)

ich will ja genau das umgekehrte haben. de wandelt sie mir in z. B. 234,233.50


----------



## CelikBlek (15. Mrz 2006)

So habe es mit zwei templates lösen können:

```
<xsl:template name="ersetze">
		<xsl:param name="mitp"/>
		
		<xsl:variable name="zeichen" select="substring($mitp, 1, 1)"/>
		<xsl:variable name="laenge" select="string-length($mitp)"/>
		<xsl:variable name="neubetrag" select="substring($mitp, 2, $laenge)"/>
		
		<xsl:if test="not($laenge = 0)">
			<xsl:choose>
				<xsl:when test="$zeichen = '.'">
					<xsl:text>,</xsl:text>
				</xsl:when>
				<xsl:when test="$zeichen = ','">
					<xsl:text>.</xsl:text>
				</xsl:when>
				<xsl:otherwise>
					<xsl:value-of select="$zeichen"/>
				</xsl:otherwise>
			</xsl:choose>
			<xsl:call-template name="ersetze">
				<xsl:with-param name="mitp" select="$neubetrag"/>
			</xsl:call-template>
		</xsl:if>
	</xsl:template>
	
	<xsl:template name="konvertBetrag">
		<xsl:param name="betrag"/>
		<xsl:variable name="mitp" select="format-number($betrag, '###,###.00')"/>
		
		<xsl:call-template name="ersetze">
				<xsl:with-param name="mitp" select="$mitp"/>
		</xsl:call-template>
	</xsl:template>
```


----------



## byte (15. Mrz 2006)

Also nochmal langsam:

1. Du erzeugst Dir ein Decimal-Format mit dem von mir oben geposteten XSL-Tag. Also z.B. so


```
<xsl:decimal-format name="meinDezimalFormat" decimal-seperator="," grouping-seperator="." />
```

Da kannst Du halt Angaben machen, wie z.B. das Dezimaltrennzeichen aussehen soll etc. pp. Das Attribut Name ist halt dann wichtig, wenn Du die Funktion aufrufst.

2. Du definierst Dir ein Muster, wie deine Zahl nun aussehen soll, also z.B. so:


```
###,###,###.00
```

3. Du rufst die Funktion folgendermaßen auf:


```
format-number('1234567', '###,###.00', meinDezimalFormat)
```

Die Methode liefert dann die Zahl (1234567) im übergebenen Dezimalformat (meinDezimalFormat) nach dem entsprechenden Muster (###,###.00) zurück. Das Dezimalformat ist dabei optional, wenn Du es nicht angibst, benutzt er das Standardformat.


----------



## CelikBlek (17. Mrz 2006)

Was ich weiter oben geschrieben habe hat gefunzt. Läuft allerdings nicht unter Java  :bahnhof: 
Deine variante habe ich auch ausprobiert. Sowie du es beschrieben hast. Da funktioniert die Formatierung nicht:

```
<xsl:template name="konvertBetrag">	
                <xsl:decimal-format name="meinDezimalFormat" decimal-seperator="," grouping-seperator="." />
		<xsl:param name="betrag"/>
		<xsl:variable name="mitp" select="format-number($betrag, '###,###.00', meinDezimalFormat)"/>
		<xsl:value-of select="$mitp"/>
	</xsl:template>
```
Input wäre z. B. 50000.00
Output daraus ist: 50000


----------



## CelikBlek (17. Mrz 2006)

Hier nochmal die Fehlermeldung:

```
ERROR: Attempting to format number '50000.8' using pattern '#.###,00'.
```


----------

