PSQL ile float formatlama

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
Kullanıcı avatarı
mege
Admin
Mesajlar: 2360
Kayıt: 05 Şub 2004 04:32
Konum: Beşiktaş
İletişim:

PSQL ile float formatlama

Mesaj gönderen mege »

PSQL ile float bir sayıyı %n.2 şeklinde ve binlik ayraçlı halde string olarak elde etmeye çalıştımda :) hafiften duvara tosladım gibi. aşağıda tıkandığın yer substring ile tek tek karakterleri almak, comment şeklinde kapalı.
bunun haricinde daha kolay kısa yapmanın bir yolu varmıdır :oops: udf kullan demeyin olmaz :lol: beyin jimlastiği :P

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
.-.-.-.-.-.-.-. ^_^
Cevapla