मैं अग्रणी या अनुगामी रिक्त स्थान, अवधि, शून्य के बिना संख्याओं को प्रारूपित करने का एक तरीका ढूंढ रहा था (एक से कम संख्याओं के लिए एक अग्रणी शून्य को छोड़कर जो मौजूद होना चाहिए)।
यह निराशाजनक है कि इस तरह के सबसे सामान्य स्वरूपण को 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 फ़ंक्शंस में महत्वपूर्ण प्रदर्शन ओवरहेड होता है जो भारी प्रश्नों के लिए उपयुक्त नहीं है।