Номер формата MySQL с неизвестным количеством знаков после запятой

В MySQL я хочу только добавить разделитель тысяч в число, например 1234.23234, 242343.345345464, 232423.22, и отформатировать его как «1 234.23234», «242 343.345345464», «232 423,22», использовать функцию форматирования, чтобы указать количество десятичных знаков, есть ли какая-либо другая функция можно отформатировать число с неизвестным количеством знаков после запятой? для 1234.23234 я не хочу получить результат типа 1234.2323400000 или 1234.23, просто хочу получить 1234.23234.

Задачу дисплей данных лучше адресовать приложению, которое отображает эти данные. Потому что числа не имеют никакого формата: 1234,5 + 1 = 1234,5 + 1.

astentx 06.05.2022 08:34

в каком виде хранятся ваши данные?

ysth 06.05.2022 08:40

MySQL, похоже, не имеет такой функции. Вам, вероятно, потребуется написать пользовательскую функцию на основе FORMAT() плюс некоторые манипуляции со строками, чтобы удалить конечные нули после запятой.

Álvaro González 06.05.2022 08:45

попробуйте изменить свой столбец и установить его в два раза. Alter table yourtablename modify column yourcolumnName double(11,2) 11 в скобках — это максимальное количество целых чисел, а 2 — это количество десятичных знаков.

fonz 06.05.2022 08:45

Установите количество знаков после запятой, которого, очевидно, достаточно. Затем примените TRIM(TRAILING '0' FROM {formatted value}) и удалите лишние нули.

Akina 06.05.2022 09:02

данные вводятся пользователем с неизвестным количеством знаков после запятой, иногда 2 знака после запятой, иногда 4 знака после запятой (конечно, существует ограничение на количество знаков после запятой, скажем, максимум 5 знаков после запятой, пользователь может свободно вводить от 0 до 5 знаков после запятой десятичных знаков), и им нужно видеть точное число, введенное с разделителем тысяч.

saycchai 06.05.2022 10:08

что вы имеете в виду, что данные вводятся пользователем? вы форматируете данные, поступающие из вашей базы данных, изначально полученные от пользователя, да, но какой тип вы используете для их хранения?

ysth 06.05.2022 19:28

Данные @ysth вводятся пользователем, они вводят 1234 в пользовательском интерфейсе, затем они хотели бы видеть 1234 в отчете, если они вводят 12345,2345 в пользовательском интерфейсе, они хотели бы видеть 12 345,2345 в отчете. Я храню данные в VARCHAR (и, пожалуйста, НЕ спрашивайте, почему, и НЕ просите меня изменить тип данных, поскольку он не разработан мной, и я не могу изменить тип данных), и я думаю, что тип данных в VARCHAR или double не подходит. Неважно, так как я могу легко удвоить VARCHAR, моя проблема - разделитель тысяч с неизвестным количеством десятичных знаков.

saycchai 08.05.2022 09:14
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
8
49
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Как было предложено, разделите строку, отбросьте конечные нули, отформатируйте число до десятичной точки и объедините, принимая во внимание возможность отсутствия десятичных знаков, например.

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 — это именно то, что вам нужно

ysth 06.05.2022 19:34

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.00000000000
0.0000100000,000010,00001
100.010000000100.01100,01
100.010200000100.0102100,0102
100.012300456100.012300456100,012300456
1000.00000000010001.000
123456789.876543210123 456 789,87654321123.456.789,87654321
-56500.333000000-56 500,333-56 500 333

Скрипка

Другие вопросы по теме