В MySQL я хочу только добавить разделитель тысяч в число, например 1234.23234, 242343.345345464, 232423.22, и отформатировать его как «1 234.23234», «242 343.345345464», «232 423,22», использовать функцию форматирования, чтобы указать количество десятичных знаков, есть ли какая-либо другая функция можно отформатировать число с неизвестным количеством знаков после запятой? для 1234.23234 я не хочу получить результат типа 1234.2323400000 или 1234.23, просто хочу получить 1234.23234.
в каком виде хранятся ваши данные?
MySQL, похоже, не имеет такой функции. Вам, вероятно, потребуется написать пользовательскую функцию на основе FORMAT()
плюс некоторые манипуляции со строками, чтобы удалить конечные нули после запятой.
попробуйте изменить свой столбец и установить его в два раза. Alter table yourtablename modify column yourcolumnName double(11,2)
11 в скобках — это максимальное количество целых чисел, а 2 — это количество десятичных знаков.
Установите количество знаков после запятой, которого, очевидно, достаточно. Затем примените TRIM(TRAILING '0' FROM {formatted value})
и удалите лишние нули.
данные вводятся пользователем с неизвестным количеством знаков после запятой, иногда 2 знака после запятой, иногда 4 знака после запятой (конечно, существует ограничение на количество знаков после запятой, скажем, максимум 5 знаков после запятой, пользователь может свободно вводить от 0 до 5 знаков после запятой десятичных знаков), и им нужно видеть точное число, введенное с разделителем тысяч.
что вы имеете в виду, что данные вводятся пользователем? вы форматируете данные, поступающие из вашей базы данных, изначально полученные от пользователя, да, но какой тип вы используете для их хранения?
Данные @ysth вводятся пользователем, они вводят 1234 в пользовательском интерфейсе, затем они хотели бы видеть 1234 в отчете, если они вводят 12345,2345 в пользовательском интерфейсе, они хотели бы видеть 12 345,2345 в отчете. Я храню данные в VARCHAR (и, пожалуйста, НЕ спрашивайте, почему, и НЕ просите меня изменить тип данных, поскольку он не разработан мной, и я не могу изменить тип данных), и я думаю, что тип данных в VARCHAR или double не подходит. Неважно, так как я могу легко удвоить VARCHAR, моя проблема - разделитель тысяч с неизвестным количеством десятичных знаков.
Как было предложено, разделите строку, отбросьте конечные нули, отформатируйте число до десятичной точки и объедините, принимая во внимание возможность отсутствия десятичных знаков, например.
set @a = 1234.56;
select
case when instr(@a,'.') > 0 then
concat(
format(substring_index(@a,'.',1),'###,###,###'),
'.',
trim(trailing '0' from substring_index(@a,'.',-1))
)
else
format (@a,'###,###,###')
end formatted
второй параметр формата — количество цифр; предоставление «###,###,###» дает предупреждение «Усеченное неверное значение INTEGER» и обрабатывается как 0. Но 0 — это именно то, что вам нужно
MySQL, похоже, не имеет такой функции. Вам, вероятно, потребуется написать пользовательскую функцию на основе ФОРМАТ(), а также некоторые манипуляции со строками, чтобы удалить конечные нули после запятой, например, используя REGEXP_REPLACE(). Языковой стандарт по умолчанию, используемый в FORMAT()
, — это en_US
, который кажется вам нужным, поэтому вы можете опустить его или указать свой собственный, если вам нужен другой языковой стандарт.
WITH sample_data (sample_number) AS (
SELECT NULL
UNION ALL SELECT 0
UNION ALL SELECT 0.00001
UNION ALL SELECT 100.01
UNION ALL SELECT 100.0102
UNION ALL SELECT 100.012300456
UNION ALL SELECT 1000
UNION ALL SELECT 123456789.87654321
UNION ALL SELECT -56500.333
)
SELECT
sample_number,
REGEXP_REPLACE(
FORMAT(sample_number, 999),
'(\.\\d*[1-9])(0+$)|(\.0+$)',
'$1'
) AS USA,
-- Replace \. with , for locales that use comma as decimal separator:
REGEXP_REPLACE(
FORMAT(sample_number, 999, 'de_DE'),
'(,\\d*[1-9])(0+$)|(,0+$)',
'$1'
) AS Germany
FROM sample_data;
образец_номер | США | Германия |
---|---|---|
НУЛЕВОЙ | НУЛЕВОЙ | НУЛЕВОЙ |
0.000000000 | 0 | 0 |
0.000010000 | 0,00001 | 0,00001 |
100.010000000 | 100.01 | 100,01 |
100.010200000 | 100.0102 | 100,0102 |
100.012300456 | 100.012300456 | 100,012300456 |
1000.000000000 | 1000 | 1.000 |
123456789.876543210 | 123 456 789,87654321 | 123.456.789,87654321 |
-56500.333000000 | -56 500,333 | -56 500 333 |
Задачу дисплей данных лучше адресовать приложению, которое отображает эти данные. Потому что числа не имеют никакого формата: 1234,5 + 1 = 1234,5 + 1.