Я искал способ форматирования чисел без ведущих или конечных пробелов , периодов, нулей (кроме одного ведущего нуля для чисел, меньших 1, которые должны присутствовать).
] Это разочаровывает то, что такое обычное форматирование не может быть легко достигнуто в Oracle.
Даже Том Ките предложил только сложное обходное решение следующим образом:
case when trunc(x)=x
then to_char(x, 'FM999999999999999999')
else to_char(x, 'FM999999999999999.99')
end x
Но мне удалось найти более короткое решение, которое упоминает значение только один раз:
rtrim(to_char(x, 'FM999999999999990.99'), '.')
Этот работает как ожидалось для всех возможных значений:
select
to_char(num, 'FM99.99') wrong_leading_period,
to_char(num, 'FM90.99') wrong_trailing_period,
rtrim(to_char(num, 'FM90.99'), '.') correct
from (
select num from (select 0.25 c1, 0.1 c2, 1.2 c3, 13 c4, -70 c5 from dual)
unpivot (num for dummy in (c1, c2, c3, c4, c5))
) sampledata;
| WRONG_LEADING_PERIOD | WRONG_TRAILING_PERIOD | CORRECT |
|----------------------|-----------------------|---------|
| .25 | 0.25 | 0.25 |
| .1 | 0.1 | 0.1 |
| 1.2 | 1.2 | 1.2 |
| 13. | 13. | 13 |
| -70. | -70. | -70 |
По-прежнему ищет еще более короткое решение.
Существует укороченный подход с пользовательской вспомогательной функцией:
create or replace function str(num in number) return varchar2
as
begin
return rtrim(to_char(num, 'FM999999999999990.99'), '.');
end;
Но пользовательские функции pl / sql имеют значительную производительность накладные расходы , которые не подходят для тяжелых запросов.
How about:
>>> 'hello world'[::-1]
'dlrow olleh'
This is extended slice syntax. It works by doing [begin:end:step]
- by leaving begin and end off and specifying a step of -1, it reverses a string.
@Paolo's s[::-1]
is fastest; a slower approach (maybe more readable, but that's debatable) is ''.join(reversed(s))
.