2009-12-21 2 views
11

hey ich brauche einen Weg, um eine formatierte Zahl von meiner Spalte decimal(23,2) NOT NULL DEFAULT '0.00'number_format() mit MySQL

in PHP erhalte ich diese Funktion number_format('1111.00', 2, ',', '.'); verwenden könnte, würde es zurückgeben 1.111,00 (in Deutschland nutzen wir, Dezimalzahlen zu definieren)

Wie würde ich das in MySQL tun? mit Schnur ersetzt?

Antwort

16

Mit Leistungseinbuße und wenn Sie es brauchen todo nur in SQL können Sie die FORMAT Funktion und 3 REPLACE verwenden: Nach dem Format ersetzen die . mit einem anderen Zeichen beispielsweise @, dann ersetzen Sie die , mit einem . und dann die chararacter Sie von einem , wählen, die Sie für Ihr Beispiel zu 1.111,00

SELECT REPLACE(REPLACE(REPLACE(FORMAT("1111.00", 2), ".", "@"), ",", "."), "@", ",") 
+0

ok Ich denke, im gonna Stick mit dem PHP-Weg, thx für dich antworte trotzdem – antpaw

+0

Du bist willkommen :) – Patrick

+0

Das ist nicht die beste Antwort! Es gibt die Format-Funktion verfügbar, scrollen Sie nach unten und schauen Sie sich einige der anderen Antworten an, bevor Sie diese Lösung verwenden - die wichtige Sache, die hier zu beachten ist, ist die LOCALE-Option für die 'format' -Funktion, die Sie einstellen können (z. B. de_DE für deutsch) –

6

FORMAT (X, D) Formatiert die Zahl X in ein Format wie führen '#, ###, ###. ##', auf Dezimalstellen gerundet und gibt das Ergebnis als String zurück. Wenn D 0 ist, hat das Ergebnis keinen Dezimalpunkt oder Bruchteil.

SELECT FORMAT(12332.123456, 4); 
     -> '12,332.1235'
22

http://blogs.mysql.com/peterg/2009/04/

In Mysql 6.1 Sie in der Lage sein wird, FORMAT zu tun (X, D [, locale_name])

Wie in

SELECT format(1234567,2,’de_DE’); 

Denn jetzt hat diese Fähigkeit nicht existieren, obwohl Sie möglicherweise in der Lage sein, Ihr Gebietsschema in Ihrer Datenbank my.ini einzustellen, überprüfen Sie es.

+0

oi Ich habe versucht, das locale param zu verwenden und finde es jetzt nur in MySQL 6. Danke über die info. – Emerald214

+1

Leider ist der dritte Parameter illegal in MariaDB 5.5.x – Code4R7

+0

Hier ist die Liste der Ländereinstellungen https://dev.mysql.com/doc/refman/5.7/en/locale-support.html –

0

Sie müssen dies:

CONCAT(REPLACE(FORMAT(number,0),',','.'),',',SUBSTRING_INDEX(FORMAT(number,2),'.',-1)) 
+0

Jede Erklärung, wie dies funktioniert? – KLee1

8

Sie können

SELECT round(123.4566,2) -> 123.46 
+0

Das Problem mit dieser Lösung ist das Tausendertrennzeichen, SELECT Runde (123456,2) -> 123456.00 –

3

Antonio Antwort

CONCAT(REPLACE(FORMAT(number,0),',','.'),',',SUBSTRING_INDEX(FORMAT(number,2),'.',-1)) 

ist falsch; Es kann zu falschen Ergebnissen führen!

Zum Beispiel, wenn "Nummer" 12345.67 ist, wäre der resultierende String sein:

'12.346,67' 

statt

'12.345,67' 

weil FORMAT (Anzahl, 0) Runden "Nummer", wenn fraktionierte Teil ist größer oder gleich 0,5 (wie in meinem Beispiel)!

Was könnten Sie ist

CONCAT(REPLACE(FORMAT(FLOOR(number),0),',','.'),',',SUBSTRING_INDEX(FORMAT(number,2),'.',-1)) 

wenn Ihr MySQL/MariaDB des FORMAT nicht unterstützt "locale_name" (siehe MindStalker der Post - Thx 4, dass, Kumpel). Beachten Sie die FLOOR-Funktion, die ich hinzugefügt habe.

1

Mindestens so weit zurück wie MySQL 5.5 Sie verwenden können, Format:

SELECT FORMAT(123456789.123456789,2); 
/* produces 123,456,789.12 */ 

SELECT FORMAT(123456789.123456789,2,'de_DE'); 
/* 
    produces 123.456.789,12 
    note the swapped . and , for the de_DE locale (German-Germany) 
*/ 

Aus der MySQL-Dokumentation: https://dev.mysql.com/doc/refman/5.5/en/string-functions.html#function_format

Verfügbare Locales aufgeführt ist an anderer Stelle in der Dokumentation: https://dev.mysql.com/doc/refman/5.5/en/locale-support.html

+0

danke, einfache Möglichkeit, number_format von MySQL => Client zu beheben – ParisNakitaKejser