[linux-programlama] Re: Glibc, Turkce yereli ve siralama sorunu

---------

New Message Reply About this list Date view Thread view Subject view Author view Attachment view

From: Deniz Akkus Kanca (deniz@arayan.com)
Date: Fri 28 May 2004 - 23:42:19 EEST


Cum 28 May 2004 20:21 tarihinde şunları yazmıştınız:

strfmon, bir float alıyor input olarak.

> $oyle bir du$ununce daha onceden strfmon ile formatlanmi$ bir rakami
> tekrar= =20
> strfmon'a yolladiginizda bu defa c'nin ayarlari devreye giriyor ve ilk=20
> noktaya kadar olan kismi (.) rakam olarak, noktadan sonraki kismi ise
> kuru$= =20
> olarak aliyor. hali ile uzunca bir rakam bir anda cok kisa hale geliyor.=20
> rakamimiz 123456.45 olsun (float)
> ilk strfmondan sonra 123.456,45
> ikinci strfmondan sonra 123,45=20
> gibi bir durum var. Bu glibc'nin bir eksigi degilmidir ?

Yazdığınızdan, şunu anlıyorum:

#include <stdio.h>
#include <locale.h>
#include <monetary.h>

int main ( void )
{
  char buf[100] ;
  char buf2[100] ;

  float num;

  setlocale (LC_ALL, "") ;
  num = 123456.78;

  strfmon(buf,sizeof(buf),"%n", num ) ;

  printf ( "%s\n", buf ) ;

  strfmon ( buf2, sizeof ( buf2), "%n", buf ) ;

  printf ( "%s\n", buf2 ) ;
}

Bu ufak örneğin çıktısı:
123.456,78 TL
1.427.379.555.818.354.865.194.132.335.645.168.051.020.843.959.261.985.169.552.898.147.403.478.483.67
$-1¨Â @

Yani birinci strfmon doğru. İkincisinden bir hayır beklemek mümkün olmasa
gerek, çünkü float türünde girdi vereceğimize char türünde girdi verdik.

Peki, strfmon ile formatladığımız char'ı nasıl tekrar geri okutacağız?

Bunu birebir geri okutmak için bir işlev yok.

Fakat, sadece nokta/virgül için neden strfmon kullanıyorsunuz diye baktım.

  setlocale (LC_ALL, "tr_TR") ;
  num = 123456.78;
  strfmon(convbuf,sizeof(convbuf),"%n", num ) ;
  printf ( "%s\n", convbuf ) ;

  printf ( "%'.2f\n", num ) ;

% ./ornek
123.456,78 TL
123456.78

Peki acaba sorun bizim locale'de mi.

  setlocale (LC_ALL, "da_DK") ;
  num = 123456.78;
  strfmon(convbuf,sizeof(convbuf),"%n", num ) ;
  printf ( "%s\n", convbuf ) ;

  printf ( "%'.2f\n", num ) ;
  
% ./ornek
kr 123.456,78
123.456,78

Dolayısıyla istediğiniz formatta çıktı alamamanızın müsebbibi gene tr_TR
locale.

Parasal olmayan rakamlar için grouping separator ve radix tanımlanmamış.
Bunların tanımlı olduğu Danimarka locale'inde glibc sorun vermiyor.

Acaba bu Danimarka float'ını medeni bir yöntemle geri okutabilmek mümkün mü?

  setlocale (LC_ALL, "da_DK") ;
  num = 123456.78;
  sprintf ( convbuf, "%'.2f", num ) ;
  printf ( "num-->%s\n", convbuf) ;

  sscanf ( convbuf, "%'.2lf", &num2 ) ;
  printf ( "num2-->%.2lf\n", num2 ) ;
  
%./ornek
num-->123.456,78
num2-->123456,78

dolayısıyla sizin sorununuz Türk yereli ile. Ve de strfmon'u gerektiği yerde
kullanmamakla ilgili.

> kuru$=20 ayiraci ya noktadir yada virgul :))) Bazi dillerde de strfmon()
> dan gelen=20 sonucun onunde $ i$areti oluyor. Bu genel bir sorun olarak
> herkesin kar$isi= na=20
> cikabilir. O yuzden not olarak iletmek istedim.=20

Bu dillerde strfmon'un bir suçu yok. Suç, gene o dilin yerel datasında, para
işaretinin ne olduğunun yanlış olarak $ verilmiş olmasından kaynaklanıyor.

Esen kalın,
Deniz


New Message Reply About this list Date view Thread view Subject view Author view Attachment view

---------

Bu arsiv hypermail 2.1.2 tarafindan uretilmistir.