Number_format() с MySQL

Эй, мне нужен способ получить форматированное число из моего столбца decimal(23,2) NOT NULL DEFAULT '0.00'

в php я мог бы использовать эту функцию number_format('1111.00', 2, ',', '.'); он вернет 1.111,00 (в Германии мы используем определение десятичных чисел)

как я могу сделать это в mysql? с заменой строки?

Ответ 1

С снижением производительности, и если вам нужно сделать это только в SQL, вы можете использовать функцию FORMAT и 3 REPLACE: После формата замените . на другой char, например @, затем замените , на ., а затем на символ, который вы выберете ,, который приведет вас к вашему примеру в 1.111,00

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

Ответ 2

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

В Mysql 6.1 вы сможете делать FORMAT (X, D [, locale_name])

Как и в

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

Пока эта способность не существует, хотя вы МОЖЕТЕ установить свою локаль в своей базе данных my.ini.

Ответ 3

Вы можете использовать

SELECT round(123.4566,2)  -> 123.46

Ответ 4

ФОРМАТ (X, D) Форматирует число X в формате, подобном '#, ###, ###. ##', округленному до D десятичных знаков и возвращает результат в виде строки. Если D равно 0, результат не имеет десятичной или дробной части.

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

Ответ 5

Антонио отвечает

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

неверно; это может привести к неправильным результатам!

Например, если "число" равно 12345,67, результирующая строка будет:

'12.346,67'

вместо

'12.345,67'

потому что FORMAT (число, 0) округляет "число" вверх, если дробная часть больше или равна 0,5 (как в моем примере)!

Что вы МОЖЕТЕ использовать,

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

если ваш MySQL/MariaDB FORMAT не поддерживает "locale_name" (см. MindStalker post - спасибо 4, который, приятель). Обратите внимание на добавленную функцию FLOOR.

Ответ 6

По крайней мере, в MySQL 5.5 вы можете использовать формат:

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) 
*/

Из документов MySQL: https://dev.mysql.com/doc/refman/5.5/en/string-functions.html#function_format

Доступные локали перечислены в других документах: https://dev.mysql.com/doc/refman/5.5/en/locale-support.html

Ответ 7

Вам нужно следующее:

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