Thread overview
std.format ile ayraçları değiştirmek
July 31
import std.format, std.stdio;

void main() {
  format("%,?.3f",'.', 1234.5678).writeln;
}/* ÇIKTISI:

1.234.568

*/

Örnekteki virgüllü sayıyı Türk standartlarına göre yazmak istiyorum. Malumunuz, bizde binler hanesi ayracı virgül değil nokta; bunu orada soru işareti ve ekstra parametre ile yapabildim. Peki bu joker karakter nokta için de kullanabilir miyim? Örneğin beklediğin çıktı şu:

1.234,568

Çünkü bu bir tamsayı değildi ama yanıltıcı oldu :)

Teşekkürler...

July 31

Gerçi kolumuzu ensemizden çevirip sol kulağımızı sağ elimizle tutmamıza benziyor ama bu da bir çözüm :)

// D 2.0.83

import std.array,
       std.format,
       std.stdio;

void main() {
  auto ayraç = '.';
  auto sayPi = 3.141592;
  auto metin = format("%,?.3f", ayraç, sayPi*1_000f);
  auto böl = metin.split(ayraç);

  writefln("%-(%s.%),%s",böl[0..$-1], böl[$-1]);
}/* ÇIKTISI:

3.141,592

Process finished.*/

Başka önerisi olan yoksa kullanılabilir duruyor...

August 01

Bugün Ağustos'un bir pazarı idi, yani Zoom Meeting Day'de Ali Çehreli bize güzel örnekler gösterdi. Bu konuya da değindik ve şu sayfadaki switch case ifadelerini devreye aldık:

https://wiki.dlang.org/Defining_custom_print_format_specifiers#Defining_your_own_format_specifiers

Her ne kadar D'de çok fazla biçimlendirme özelliği olsa da...
(Lütfen hatırlamak için önce şu konulara da bir bakın:)

... maalesef noktanın olduğu yere (kesirli sayı ayraçı, İngilizce ondalıklı tarafa mantissa diyorlarmış) kolayca başka bir karakter koyamıyoruz. Ancak şu leziz çözüm bence daha güzel çünkü genişletilebilir ve yapabilecekleriniz hayalleriniz ile sınırlı!

import std.format, std.string, std.stdio;

struct Kesirli(T) {
  T değer_;
  T değer() const { return değer_; }

  alias değer this;

  void toString(scope void delegate(const(char)[]) sink,
                FormatSpec!char fmt) const
  {
    enum ayraç = '.';
    auto parça = format("%,?.3f", ayraç, değer).split(ayraç);
    switch(fmt.spec)
    {
      case 'f': break;
      case 'g': break;
      case 's': break;
      case 't': formattedWrite(sink, "%-(%s.%),%s",
                        parça[0..$-1], parça[$-1]);
        break;
      default:
        throw new Exception("Unknown format specifier: %" ~
                                                 fmt.spec);
    }
  }
}

auto kesirli(T)(T değer) { return Kesirli!T(değer); }

void main() {
  double piSayısını = 3.141592653589793;
  double trilyonlaÇarp = 1_000_000_000_000;
  writefln!"%t"(kesirli(piSayısını * trilyonlaÇarp));
}

Fark ettiyseniz sadece %t belirteçine (sanırım bu boşta ki belirteç?) odak noktama aldım, böylece alıştığımız sisteme kısmen dokunmadım. Gerçi Kesirli!T(değer) yapısını kullanmazsanız aşina olduğumuz belirteçler eskisi gibi çalışacaktır. Ama dikkat, bu fmt.spec(format specifiers)'i değiştirerek birçok kişiselleştirme yapılabilir!

Harika... :)
(Hani çizgi filmlerde ana karakterin gözleri parlar ya, işte ben de şu an o!)