
bunun haricinde daha kolay kısa yapmanın bir yolu varmıdır



Kod: Tümünü seç
CREATE PROCEDURE FORMATFLOAT (
FLOATPARAM FLOAT)
RETURNS (
SONUC VARCHAR(50))
AS
DECLARE VARIABLE ISARET INTEGER;
DECLARE VARIABLE IDONGU INTEGER;
DECLARE VARIABLE INOKTAPOS INTEGER;
DECLARE VARIABLE IBASPOS INTEGER;
DECLARE VARIABLE STMP VARCHAR(50);
BEGIN
/* null kontrolü */
SONUC = NULL;
isaret = 1;
IF (FLOATPARAM IS NULL) THEN EXIT;
/* sifir kontrolu */
IF (FLOATPARAM = 0) THEN
begin
sonuc = '0.00';
exit;
end
/* negatif kontrol */
if (floatparam < 0) then
begin
isaret = -1;
FLOATPARAM = FLOATPARAM * -1;
end
/* virgulleri ekle */
iNoktaPos = 0;
sTmp = cast(floatparam as NUMERIC(18,0));
while (sTmp||'X' <> 'X') do
begin
sTmp = substring(sTmp from 2);
iNoktaPos = iNoktaPos + 1;
end
iBasPos = 0;
if (iNoktaPos in(4,7,10,13,16,19,22,25)) then
iBasPos = 1;
if (iNoktaPos in(5,8,11,14,17,20,23,26)) then
iBasPos = 2;
if (iNoktaPos in(6,9,12,15,18,21,24,27)) then
iBasPos = 3;
idongu = iBasPos;
sTmp = '';
while (idongu < iNoktaPos) do
begin
/* sTmp = sTmp + substring(sTmp from idongu for 1); */
idongu = idongu +1;
end
/* sonucu yaz */
sonuc = sTmp;
END
== ek : kısmi çözüm, fazla test etmedim. hata olabilir!
Kod: Tümünü seç
CREATE PROCEDURE FORMATFLOAT (
FLOATPARAM FLOAT)
RETURNS (
SONUC VARCHAR(50))
AS
DECLARE VARIABLE ISARET INTEGER;
DECLARE VARIABLE INOKTAPOS INTEGER;
DECLARE VARIABLE STMP VARCHAR(50);
DECLARE VARIABLE STMPTers VARCHAR(50);
DECLARE VARIABLE sTMPSonuc VARCHAR(50);
BEGIN
/* null kontrolü */
SONUC = NULL;
isaret = 1;
IF (FLOATPARAM IS NULL) THEN EXIT;
/* sifir kontrolu */
IF (FLOATPARAM = 0) THEN
begin
sonuc = '0.00';
exit;
end
/* negatif kontrol */
if (floatparam < 0) then
begin
isaret = -1;
FLOATPARAM = FLOATPARAM * -1;
end
/* virgulleri ekle */
iNoktaPos = 0;
sTmp = cast(floatparam as NUMERIC(18,0));
/* ters cevir */
STMPTers = '';
while (sTmp||'X' <> 'X') do
begin
STMPTers = substring(sTmp from 1 for 1) || STMPTers;
sTmp = substring(sTmp from 2);
end
/* virgul ekle ters cevir */
sTmp = STMPTers;
STMPTers = '';
while (sTmp||'X' <> 'X') do
begin
iNoktaPos = iNoktaPos + 1;
STMPTers = substring(sTmp from 1 for 1) || STMPTers;
if (inoktapos in (3,6,9,12,15)) then
STMPTers = ',' || STMPTers ;
sTmp = substring(sTmp from 2);
end
sTmp = STMPTers;
if (substring(sTmp from 1 for 1) = ',') then
sTmp = substring(sTmp from 2);
if (isaret = -1) then
sTmp = '-' || sTmp;
sTMPSonuc = sTmp;
/* kusurat */
sTmp = cast(floatparam as NUMERIC(18,2));
STMPTers = '';
while (sTmp||'X' <> 'X') do
begin
STMPTers = substring(sTmp from 1 for 1) || STMPTers;
sTmp = substring(sTmp from 2);
end
sTmp = substring(sTmpTers from 1 for 2);
STMPTers = '';
while (sTmp||'X' <> 'X') do
begin
STMPTers = substring(sTmp from 1 for 1) || STMPTers;
sTmp = substring(sTmp from 2);
end
sTmp = STmpTers;
sTMPSonuc = sTMPSonuc || '.' || sTmp;
sonuc = sTMPSonuc;
END