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