String'den Okuma İşlemleri
Kendi Kodumuz
Diyelim ki string'den okuma için kendi kodumuzu yazmamız gerekti. Şöyle olabilir. Önce tüm sayı nokta dikkate alınmadan okunuyor. 10'un noktanın sağındaki hane kadar üssü alınıyor ve tüm sayı bu değer ile bölünüyor.
C++
stream'den okunabilir.
lexical_cast kullanılabilir.
double atof (const char* str) kullanılarak yapılabilir.
atof
%lf ile double'ın okunması
printf ile double yazdırırken sadece %f kullanmak yeterliydi. Çünkü printf variadic olduğundan herşeyi double'a cast ediyordu. Ancak okurken scanf türü metodlara sadece pointer geçiyoruz. Dolayısıyla kaç byte okumak istediğimizi belirtmemiz gerekiyor. %lf ile double okumak istediğimizi belirtiyoruz.
strod
strod atof'tan daha gelişmiş. Gereksiz boşlukları atlıyor ve alabildiği kadar çok karakteri çevirmeye çalışıyor.
Kendi Kodumuz
Diyelim ki string'den okuma için kendi kodumuzu yazmamız gerekti. Şöyle olabilir. Önce tüm sayı nokta dikkate alınmadan okunuyor. 10'un noktanın sağındaki hane kadar üssü alınıyor ve tüm sayı bu değer ile bölünüyor.
private static double GetDoubleValue(string input)
{
double n = 0;
int decimalPosition = input.Length;
bool separatorFound = false;
bool negative = input[0] == '-';
for (int k = (negative ? 1 : 0); k < input.Length; k++)
{
char c = input[k];
if (c == '.' || c == ',')
{
if (separatorFound)
return Double.NaN;
decimalPosition = k + 1;
separatorFound = true;
}
else
{
if (!char.IsDigit(c))
return Double.NaN;
n = (n * 10) + (c - '0');
}
}
return ((negative ? -1 : 1) * n) / pow(10, input.Length - decimalPosition);
}
C++
stream'den okunabilir.
std::istringstream s( "1234.123456" );
double d;
s >> d;
boostlexical_cast kullanılabilir.
std::string val = "2.12e-6";
double y = boost::lexical_cast<double>(val);
Cdouble atof (const char* str) kullanılarak yapılabilir.
%lf ile double'ın okunması
printf ile double yazdırırken sadece %f kullanmak yeterliydi. Çünkü printf variadic olduğundan herşeyi double'a cast ediyordu. Ancak okurken scanf türü metodlara sadece pointer geçiyoruz. Dolayısıyla kaç byte okumak istediğimizi belirtmemiz gerekiyor. %lf ile double okumak istediğimizi belirtiyoruz.
strod
strod atof'tan daha gelişmiş. Gereksiz boşlukları atlıyor ve alabildiği kadar çok karakteri çevirmeye çalışıyor.
Hiç yorum yok:
Yorum Gönder