Как заполнить нулями числовое поле?

Как я могу дополнить целое число нулями слева (lpad) и дополнить десятичное число после десятичного разделителя нулями справа (rpad).

Например: если у меня 5,95, я хочу получить 00005950 (без разделителя).


person Abderrahim    schedule 24.03.2016    source источник
comment
Доступно ли в вашей базе данных что-то вроде sprintf()? Это был бы самый простой и читаемый способ сделать это.   -  person Emery Lapinski    schedule 24.03.2016


Ответы (4)


Если вам нужно значение до тысячных, но не более десятичной части, вы можете умножить на 1000 и либо FLOOR, либо использовать TRUNC. Как это:

SELECT TO_CHAR( TRUNC( value * 1000 ), '00000009' )
FROM   table_name;

or:

SELECT LPAD( TRUNC( value * 1000 ), 8, '0' )
FROM   table_name;

Использование TO_CHAR позволит установить только максимальное количество цифр на основе маски формата (если значение превысит этот размер, вместо чисел будет отображаться #s), но оно будет обрабатывать отрицательные числа (знак минуса помещается перед ведущими нулями).

Использование LPAD позволит ввести любой размер ввода, но если ввод отрицательный, знак минус будет в середине строки (после любых начальных нулей).

person MT0    schedule 24.03.2016
comment
Я предпочитаю этот SELECT LPAD( TRUNC( 5.9516 * 1000 ), 8, 0 ) FROM dual; - person Abderrahim; 24.03.2016
comment
У меня было это для начала, затем я обновил его, а теперь вернул его, немного оценив плюсы и минусы обеих версий при рассмотрении длины ввода и отрицательных значений. - person MT0; 24.03.2016
comment
Маска формата даст 9-символьный результат; у вас будет начальный пробел для положительных значений, от которого вы можете избавиться с помощью модификатора FM; отрицательные значения по-прежнему будут состоять из 9 символов. Что может быть хорошо, конечно. (И вы все равно удалили часть о том, что это всегда 8 символов!) - person Alex Poole; 24.03.2016
comment
Хорошо, может быть, мне понадобится что-то еще, например, если у меня есть 5,9516 (четвертая цифра › 5, поэтому мы увеличиваем три цифры на 1. например, если у меня есть 5,9516, я получу 00005952 вместо 00005951). - person Abderrahim; 24.03.2016
comment
@Abderrahim - просто используйте ROUND() вместо TRUNC()? - person Alex Poole; 24.03.2016

Как насчет умножения и lpad():

select lpad(col * 1000, 8, '0')
. . .
person Gordon Linoff    schedule 24.03.2016
comment
Да, вы правы, но проблема, если у меня есть более 3 цифр после десятичного разделителя, например 5,9562, я получу 5956,2. - person Abderrahim; 24.03.2016

Попробуйте следующее:

select lpad(5.42562 * POWER(10, length(trim(regexp_replace(5.42562, '[^.]+\.(.*)$', '.\1')))-1), 8, '0') from dual;

где 5.42562 будет столбцом, который вам нужен.

Итак, в основном вы используете ответ Гордона Линоффа, но умножаете на 10 до количества десятичных знаков.

person Manuel S.    schedule 24.03.2016
comment
Мне нужно только сохранить 3 цифры после десятичного разделителя - person Abderrahim; 24.03.2016
comment
и заполнение десятичного знака после десятичного разделителя нулями справа (rpad). не понял этого из вашего вопроса :(. Думаю, мой подход вам не подходит. - person Manuel S.; 24.03.2016

select lpad(rpad(replace('5.95','.',''),4,0),8,0) from dual;

Предполагая, что у вас есть шкала или нет, string должен быть суффиксом с 0 и префиксом 0 до 8-й цифры. Выкладываю запрос.

Дайте мне знать, если это удовлетворяет вашим требованиям или требуется что-то еще.

select lpad(rpad(replace('5.95','.',''),4,0),8,0) from dual;

person user3576518    schedule 05.04.2016