• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

JS Snippet

T

ToM80

Guest
Moin,

habe keinen anderen Platz gefunden. Habe gerade einen Währungsformartierfunktion gebaut und dachte, vllt. ist sie auch für andere Nützlich.

Externe Datei glob_currency.js
Code:
/**Save as UTF-8!!! **/

var glob_currency=new Array();
glob_currency['curr']=new Object();
glob_currency['curr']['CZ']='Kč';
glob_currency['curr']['DE']='€';
glob_currency['curr']['DK']='kr';
glob_currency['curr']['EN']='£';
glob_currency['curr']['ES']='€';
glob_currency['curr']['FI']='€';
glob_currency['curr']['FR']='€';
glob_currency['curr']['IT']='€';
glob_currency['curr']['NL']='€';
glob_currency['curr']['PL']='zł';
glob_currency['curr']['PT']='€';
glob_currency['curr']['SE']='kr';

glob_currency['dev']=new Object();
glob_currency['dev']['CZ']=',';
glob_currency['dev']['DE']=',';
glob_currency['dev']['DK']=',';
glob_currency['dev']['EN']='.';
glob_currency['dev']['ES']=',';
glob_currency['dev']['FI']=',';
glob_currency['dev']['FR']=',';
glob_currency['dev']['IT']=',';
glob_currency['dev']['NL']=',';
glob_currency['dev']['PL']=',';
glob_currency['dev']['PT']=',';
glob_currency['dev']['SE']=',';

glob_currency['pos']=new Object();
glob_currency['pos']['CZ']=0;
glob_currency['pos']['DE']=1;
glob_currency['pos']['DK']=0;
glob_currency['pos']['EN']=0;
glob_currency['pos']['ES']=1;
glob_currency['pos']['FI']=1;
glob_currency['pos']['FR']=1;
glob_currency['pos']['IT']=1;
glob_currency['pos']['NL']=1;
glob_currency['pos']['PL']=1;
glob_currency['pos']['PT']=1;
glob_currency['pos']['SE']=1;

Hier die Funktion:
PHP:
/*************************************************************
*                                                            *
* This function is used for formatting different currencies. *
* This function needs the external js glob_currency.js.      *
*                                                            *
* float sum The amount that has to be transformed            *
* string land The iso of the land that is used               *
*                                                            *
* return string The formated amount with currency            *
*                                                            *
*************************************************************/
function setCurVal(sum, land) {
	sum=sum.toFixed(2);
	sum=sum.toString();
	sum=sum.split(".");
	if (glob_currency['pos'][land]==0) {
		return glob_currency['curr'][land]+" "+sum[0]+glob_currency['dev'][land]+sum[1];
	} else if (glob_currency['pos'][land]==1) {
		return sum[0]+glob_currency['dev'][land]+sum[1]+" "+glob_currency['curr'][land];
	}
}



Hier noch ein Bsp der Nutzung:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title>JS Curr Test</title>
<script type="text/javascript" src="glob_currency.js"></script>
<script type="text/javascript">
/*************************************************************
*                                                                                                           *
* This function is used for formatting different currencies.                                *
* This function needs the external js glob_currency.js.                                    *
*                                                                                                           *
* float sum The amount that has to be transformed                                        *
* string land The iso of the land that is used                                                 *
*                                                                                                           *
* return string The formated amount with currency                                         *
*                                                                                                           *
*************************************************************/
function setCurVal(sum, land) {
	sum=sum.toFixed(2);
	sum=sum.toString();
	sum=sum.split(".");
	if (glob_currency['pos'][land]==0) {
		return glob_currency['curr'][land]+" "+sum[0]+glob_currency['dev'][land]+sum[1];
	} else if (glob_currency['pos'][land]==1) {
		return sum[0]+glob_currency['dev'][land]+sum[1]+" "+glob_currency['curr'][land];
	}
}

</script>
</head>
<body>
<form action="javascript:void(0);" method="post">
<input id="inpAmount" type="text" value="1.50" /><br />
<select id="selCountry" onchange="document.getElementById('showCurr').innerHTML=setCurVal(parseFloat(document.getElementById('inpAmount').value),this.value);">
	<option value="CZ">Tschechien</option>
	<option value="DE" selected="selected">Deutschland</option>
	<option value="DK">Dänemark</option>
	<option value="EN">England</option>
	<option value="ES">Spanisch</option>
	<option value="FI">Finnland</option>
	<option value="FR">Frankreich</option>
	<option value="IT">Italien</option>
	<option value="NL">Niederlande</option>
	<option value="PL">Polen</option>
	<option value="PT">Portugal</option>
	<option value="SE">Schweden</option>
</select>
<div id="showCurr"></div>
</form>
</body>
</html>
 
Lese ich da etwas von runden? Welches Ergebnis gibt deine Rundung für den Wert 0.055 bei zwei Stellen?
 
sum=sum.toFixed(2);

oder nicht?
Doch. Habs dann doch mal gerade ausprobiert, kommt tatsächlich 0.06 raus. Ich hatte mit etwas anderem gerechnet.
Aber mit toFixed () kann man anscheinend tatsächlich korrekt kaufmännisch runden.
Das ist nicht in allen Sprachen so einfach :)
 
Wenn es um Geld geht niemals - ich wiederhole - NIEMALS mit Fließkommezahlen rechnen:
Code:
0.015.toFixed(2)
Es gibt sehr wenige Programmiersprachen, die Dezimalzahlen 100%ig korrekt behandeln (binäre Zahlen vs. "10er" Zahlen) und die Leute reagieren bei den meisten Sachen da nicht so empfindlich... aber eben schon beim Geld.

Wenn man da auf der sicheren Seite sein will, sollte man seine Beträge einfach immer in Cent (oder was hald die kleinste Geldeinheit ist) abspeichern/berechnen und dann auf die größere Einheit hochrechnen.

@TOM: zu deinem Code:
1. Warum initialisierst du glob_currency als Array und verwendest es dann als Objekt? Du solltest da auch ein object verwenden.
2. Ich persönlich finde ja die Schreibweise, bei der man ein Objekt füllt, indem man jeden Wert einzeln an seinen Platz setzt, nicht besonders elegant/wartungsfreundlich. Du könntest aus deinen vielen Zuweisung mit ein paar Objektliteralen eine einzige Zuweisung machen.
3. Der Aufbau des Objekts glob_currency schein mir nicht ideal. Wäre diese Strukturierung nicht sinnvoller: glob_currency[lang].EIGENSCHAFT_DIE_ICH_AUSLESEN_WILL ? Damit könnte ich schneller eine zusätzliche Währung einpflegen: eine einzige Objektzuweisung an glob_currency[newLang] anstatt drei Zuweisungen an glob_currency.curr[newLang], glob_currency.dev[newLang] und glob_currency.pos[newLang].
4. Du schreibst zwar extra "Save as UTF-8!", aber ich würde mich ja nicht auf alle Transportebenen verlassen, die so ein Skript mal nimmt. Warum machst du bei den Sonderzeichen nicht einfach die Unicode-Schreibweise? Dann hast du überhaupt kein Problem mit irgendwelcher Kodierungen.

Bei mir würde die glob_currency.js dann so aussehen:
Code:
var glob_currency = {
	CZ: {
		curr: "K\u010d",
		dev: ",",
		pos: 0
	},
	DE: {
		curr: "\u20ac",
		dev: ",",
		pos: 1
	},
	DK: {
		curr: "kr",
		dev: ",",
		pos: 0
	},
	EN: {
		curr: "\u00a3",
		dev: ".",
		pos: 0
	},
	ES: {
		curr: "\u20ac",
		dev: ",",
		pos: 1
	},
	FI: {
		curr: "\u20ac",
		dev: ",",
		pos: 1
	},
	FR: {
		curr: "\u20ac",
		dev: ",",
		pos: 1
	},
	IT: {
		curr: "\u20ac",
		dev: ",",
		pos: 1
	},
	NL: {
		curr: "\u20ac",
		dev: ",",
		pos: 1
	},
	PL: {
		curr: "z\u0142",
		dev: ",",
		pos: 1
	},
	PT: {
		curr: "\u20ac",
		dev: ",",
		pos: 1
	},
	SE: {
		curr: "kr",
		dev: ",",
		pos: 1
	}
};
 
Zurück
Oben