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!)