Alıntı (zafer):
> anlamadığım nokta s.length kullanımı, yukarıdaki bilgilerle göre bu kullanım yanlış olmuyor mu?
leftJustify()'ın 'width' parametresinin hedefte istenen Unicode karakter adedi olduğunu görünce daha iyi anlaşılıyor. Yani hedef bir char[] bile olsa uzunluk olarak 10 char değil, 10 Unicode karakteri istiyoruz.
İşleve yardımcı satırlar ekledim:
import std.stdio;
import std.traits;
import std.range;
import std.conv;
S leftJustify_mesajlı(S)(S s, size_t width, dchar fillChar = ' ') @trusted
if(isSomeString!S)
{
alias typeof(S[0]) C;
writeln("\n-----");
writefln("tür: %s, dizgi: \"%s\", istenen uzunluk: %s, fillChar: '%s'",
Unqual!(C).stringof, s, width, fillChar);
if(cast(dchar)(cast(C)fillChar) == fillChar)
{
immutable len = s.walkLength();
writefln("s.walkLength(): %s, s.length: %s", len, s.length);
if(len >= width)
return s;
writeln("hedef için gereken uzunluk: ", width - len + s.length);
auto retval = new Unqual!(C)[width - len + s.length];
writefln("hedefin ilk %s elemanına dizgiyi yerleştiriyoruz", s.length);
retval[0 .. s.length] = s[];
writefln("geri kalan %s elemanına da '%s'", retval.length - s.length, fillChar);
retval[s.length .. $] = cast(C)fillChar;
return cast(S)retval;
}
else
{
auto dstr = to!dstring(s);
if(dstr.length >= width)
return s;
auto retval = new dchar[](width);
retval[0 .. dstr.length] = dstr[];
retval[dstr.length .. $] = fillChar;
return to!S(retval);
}
}
void main()
{
leftJustify_mesajlı("abc", 10, '.');
leftJustify_mesajlı("abcçd", 10, '.');
leftJustify_mesajlı("abcçd\U00010330", 10, '.');
leftJustify_mesajlı("abc"w, 10, '.');
leftJustify_mesajlı("abcçd"w, 10, '.');
leftJustify_mesajlı("abcçd\U00010330"w, 10, '.');
leftJustify_mesajlı("abc"d, 10, '.');
leftJustify_mesajlı("abcçd"d, 10, '.');
leftJustify_mesajlı("abcçd\U00010330"d, 10, '.');
}
Çıktısı (O garip karakteri elimle ? olarak değiştiriyorum. Bizim forum o karakteri halledemiyor.) :
'
tür: char, dizgi: "abc", istenen uzunluk: 10, fillChar: '.'
s.walkLength(): 3, s.length: 3
hedef için gereken uzunluk: 10
hedefin ilk 3 elemanına dizgiyi yerleştiriyoruz
geri kalan 7 elemanına da '.'
tür: char, dizgi: "abcçd", istenen uzunluk: 10, fillChar: '.'
s.walkLength(): 5, s.length: 6
hedef için gereken uzunluk: 11
hedefin ilk 6 elemanına dizgiyi yerleştiriyoruz
geri kalan 5 elemanına da '.'
tür: char, dizgi: "abcçd?", istenen uzunluk: 10, fillChar: '.'
s.walkLength(): 6, s.length: 10
hedef için gereken uzunluk: 14
hedefin ilk 10 elemanına dizgiyi yerleştiriyoruz
geri kalan 4 elemanına da '.'
tür: wchar, dizgi: "abc", istenen uzunluk: 10, fillChar: '.'
s.walkLength(): 3, s.length: 3
hedef için gereken uzunluk: 10
hedefin ilk 3 elemanına dizgiyi yerleştiriyoruz
geri kalan 7 elemanına da '.'
tür: wchar, dizgi: "abcçd", istenen uzunluk: 10, fillChar: '.'
s.walkLength(): 5, s.length: 5
hedef için gereken uzunluk: 10
hedefin ilk 5 elemanına dizgiyi yerleştiriyoruz
geri kalan 5 elemanına da '.'
tür: wchar, dizgi: "abcçd?", istenen uzunluk: 10, fillChar: '.'
s.walkLength(): 6, s.length: 7
hedef için gereken uzunluk: 11
hedefin ilk 7 elemanına dizgiyi yerleştiriyoruz
geri kalan 4 elemanına da '.'
tür: dchar, dizgi: "abc", istenen uzunluk: 10, fillChar: '.'
s.walkLength(): 3, s.length: 3
hedef için gereken uzunluk: 10
hedefin ilk 3 elemanına dizgiyi yerleştiriyoruz
geri kalan 7 elemanına da '.'
tür: dchar, dizgi: "abcçd", istenen uzunluk: 10, fillChar: '.'
s.walkLength(): 5, s.length: 5
hedef için gereken uzunluk: 10
hedefin ilk 5 elemanına dizgiyi yerleştiriyoruz
geri kalan 5 elemanına da '.'
tür: dchar, dizgi: "abcçd?", istenen uzunluk: 10, fillChar: '.'
s.walkLength(): 6, s.length: 6
hedef için gereken uzunluk: 10
hedefin ilk 6 elemanına dizgiyi yerleştiriyoruz
geri kalan 4 elemanına da '.'
'
Ali
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]