Zamanında Altın Alsaydık… | C#
Merhaba, zaman zaman sohbetlerimizde, geçmişte yapılan bir yatırım veya harcama mevzusu geçtiğinde; “O parayı o zaman dolara yatırsaydım acaba şimdi ne kadar olurdu?” ya da “Keşke altın alsaydık şimdi daha fazla kâr elde ederdik…” gibi iddialar ortaya atılır ve bazen de bunları doğrulamaya uğraşmayız. O yıldaki altın fiyatını bul-çarp-böl…vs. uzun iş diyerek üşeniriz. İşte bunun için ufak bir çözüm geliştirdim. Bir çok icat da bu tür üşengeçliklerden çıkıyordu galiba.
https://dovizaltin.zamkinos.net
HtmlAgilityPack kullandım bir .NetCore Web Uygulaması’nda.
INDEX.CSHTML
@page
@model IndexModel
@{
ViewData["Title"] = "Home page";
}
<title>Altın/Döviz Hesaplama</title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css">
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<style>
body {
font-family: Arial, sans-serif;
margin: 0;
padding: 20px;
display: flex;
flex-direction: column;
align-items: center;
background-color: #f4f4f4;
}
.container {
max-width: 600px;
width: 100%;
background: white;
padding: 20px;
border-radius: 8px;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
}
h2 {
text-align: center;
}
label {
display: block;
margin: 10px 0 5px;
}
input[type="date"],
input[type="number"] {
width: 100%;
padding: 10px;
margin-bottom: 20px;
border: 1px solid #ccc;
border-radius: 5px;
}
.button-container {
display: flex;
flex-direction: column;
gap: 10px;
}
button {
padding: 10px;
border: none;
border-radius: 5px;
background-color: #28a745;
color: white;
cursor: pointer;
font-size: 16px;
transition: background-color 0.3s;
display: flex; /* Simge ve yazıyı yan yana yerleştirir */
align-items: center; /* Dikey hizalama */
justify-content: center; /* Yatay hizalama */
}
button i {
margin-right: 10px; /* Simge ile yazı arasında boşluk */
}
button:hover {
background-color: #218838;
}
#results {
margin-top: 20px;
background: #e9ecef;
padding: 10px;
border-radius: 5px;
display: none; /* İlk başta gizli */
}
input[type="text"] {
width: 100%;
padding: 10px;
margin-bottom: 20px;
border: 1px solid #ccc;
border-radius: 5px;
font-size: 16px;
}
</style>
<div class="container">
<h2>Altın/Döviz Hesaplama Aracı</h2>
<label for="datepicker">Tarih Seçin:</label>
<input type="date" id="datepicker" />
<label for="amount">Tutar (TL):</label>
<input type="text" id="amount" placeholder="TL param vardı" />
<div class="button-container">
<button class="calculate" data-type="ALT">
<i class="fas fa-gem"></i> Altın Alsaydım Bugün Ne Kadar Olurdu?
</button>
<button class="calculate" data-type="USD">
<i class="fas fa-dollar-sign"></i> Dolar Alsaydım Bugün Ne Kadar Olurdu?
</button>
<button class="calculate" data-type="EUR">
<i class="fas fa-euro-sign"></i> Euro Alsaydım Bugün Ne Kadar Olurdu?
</button>
<button class="calculate" data-type="GBP">
<i class="fas fa-pound-sign"></i> Sterlin Alsaydım Bugün Ne Kadar Olurdu?
</button>
<button class="calculate" data-type="ALL">
<i class="fas fa-calculator"></i> Tümünü Hesapla
</button>
</div>
<div id="results"></div>
</div>
<script>
// Girilen değeri formatlayan fonksiyon (binlik ayraç + kuruş)
function formatCurrency(value) {
// Sadece rakam ve virgülleri al (diğer karakterleri temizle)
value = value.replace(/[^0-9,]/g, "");
// Eğer virgül varsa, kuruş olarak işlem yap
let parts = value.split(',');
let integerPart = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, "."); // Binlik ayraç ekleme
let decimalPart = parts[1] ? parts[1].substring(0, 2) : ''; // Sadece 2 basamak kuruş al
// Kuruş varsa birleştir, yoksa sadece tam sayı kısmını göster
return decimalPart ? `${integerPart},${decimalPart}` : integerPart;
}
// Focus kaybolduğunda (blur), formatı uygula
$('#amount').on('blur', function () {
const inputVal = $(this).val();
const formattedVal = formatCurrency(inputVal);
$(this).val(formattedVal); // Formatlanmış değeri geri yaz
});
// Focus olduğunda, formatı kaldır (düzenlemeye açık hale getir)
$('#amount').on('focus', function () {
const inputVal = $(this).val().replace(/\./g, '').replace(/,/g, ''); // Nokta ve virgülleri temizle
$(this).val(inputVal); // Formatı kaldırarak orijinal haliyle göster
});
$(document).ready(function () {
// Tekil butonlar için tıklama olayı
$('.calculate').click(async function () {
$('#results').empty();
let date = $('#datepicker').val(); // Tarih inputundan tarih al
// Tarih formatını YYYY-MM-DD'ye dönüştür
const formattedDate = new Date(date).toISOString().split('T')[0]; // 'YYYY-MM-DD' formatında
const amount = Number($('#amount').val().replace('.', '').replace(',', '.'));
const type = $(this).data('type');
let gelenTutar = 0.0;
let _data;
if (type === 'ALL') {
let _type = '';
for (let i = 1; i < 5; i++) {
switch (i) {
case 1:
_type = 'ALT';
break;
case 2:
_type = 'USD';
break;
case 3:
_type = 'EUR';
break;
case 4:
_type = 'GBP';
break;
}
_data = JSON.stringify({
Tarih: formattedDate,
AltinDovizTuru: _type,
Tutar: amount
});
let result = await makeAjaxRequest(_data); // AJAX isteğini bekle
gelenTutar = Number(result);
const formattedAmount = amount.toLocaleString('tr-TR', { minimumFractionDigits: 2 });
const formattedGelenTutar = gelenTutar.toLocaleString('tr-TR', { minimumFractionDigits: 2 });
let dummyResult = `${date} tarihinde ${formattedAmount} TL param vardı, ${_type} alsaydım bugün ${formattedGelenTutar} TL olurdu.`;
$('#results').append(`<p>${dummyResult}</p>`); // Sonucu ekle
}
}
else {
_data = JSON.stringify({
Tarih: formattedDate,
AltinDovizTuru: type,
Tutar: amount
});
let result = await makeAjaxRequest(_data); // AJAX isteğini bekle
gelenTutar = Number(result);
const formattedAmount = amount.toLocaleString('tr-TR', { minimumFractionDigits: 2 });
const formattedGelenTutar = gelenTutar.toLocaleString('tr-TR', { minimumFractionDigits: 2 });
let dummyResult = `${date} tarihinde ${formattedAmount} TL param vardı, ${type} alsaydım bugün ${formattedGelenTutar} TL olurdu.`;
$('#results').append(`<p>${dummyResult}</p>`); // Sonucu ekle
}
$('#results').show(); // Sonuç kutusunu göster
});
async function makeAjaxRequest(d) {
return new Promise((resolve, reject) => {
$.ajax({
url: '@Url.Page("Index", "Calculate")', // Razor Pages metodu için URL
type: 'POST', // POST isteği
contentType: 'application/json', // JSON içeriği gönderildiğini belirt
data: d, // Gönderilecek veri
success: function (result) {
resolve(result); // Başarılı olduğunda sonucu döndür
},
error: function (xhr, status, error) {
reject('Hata: ' + error); // Hata durumunda hata mesajı döndür
}
});
});
}
});
</script>
INDEX.CSHTML.CS
using HtmlAgilityPack;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using System.Globalization;
using System.Text;
namespace AltinDovizHesapCoreWeb.Pages
{
[IgnoreAntiforgeryToken] // CSRF korumasını kaldır
public class IndexModel : PageModel
{
// AJAX isteği ile çalışan metot
public JsonResult OnPostCalculate([FromBody] HesaplamaRequest req)
{
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
decimal dovizAltinFiyat = dovizAltinFiyatBul(req.Tarih, req.AltinDovizTuru, Sabitler.Satis);
decimal decKuraGoreTutar = dovizAltinFiyat == 0 ? 0 : req.Tutar / dovizAltinFiyat;
decimal gununFiyati = dovizAltinFiyatBul(DateTime.Now.Date, req.AltinDovizTuru, Sabitler.Alis);
// Basit bir hesaplama (örneğin, sayıyı 2 ile çarpma)
decimal result = decKuraGoreTutar * gununFiyati;
// Sonucu JSON olarak döndür
return new JsonResult(result);
}
private decimal dovizAltinFiyatBul(DateTime t, string d, string a)
{
switch (d)
{
case Sabitler.Dolar:
case Sabitler.Euro:
case Sabitler.Sterlin:
return dovizFiyatBul(t, d, a);
case Sabitler.Altin:
return altinFiyatBul(t, d, a);
default:
return 0;
}
}
private decimal altinFiyatBul(DateTime tarih, string dovizCinsi, string alisSatis)
{
decimal decSatisFiyati = 0;
try
{
string url = Sabitler.UrlAltinGumus + tarih.ToString("yyyy") + "/" + tarih.ToString("MM") + "/" + tarih.ToString("dd");
HttpClient httpClient = new HttpClient();
string html = httpClient.GetStringAsync(url).Result;
HtmlDocument htmlDocument = new HtmlDocument();
htmlDocument.LoadHtml(html);
HtmlNode madenDivNode = htmlDocument.DocumentNode.SelectSingleNode("//div[@class='kurlar bordernone' and @title='" + titleGetir(dovizCinsi) + "']");
if (madenDivNode != null)
{
HtmlNode satisFiyatiLiNode = madenDivNode.SelectSingleNode(".//ul/li[@class='midrow " + convertTurkishToEnglish(alisSatis) + "' and @title='" + titleGetir(dovizCinsi) + " - " + alisSatis + "']");
if (satisFiyatiLiNode != null)
{
string strSatisFiyati = satisFiyatiLiNode.InnerText.Trim();
decSatisFiyati = decimal.Parse(strSatisFiyati.Replace(",", "."), CultureInfo.GetCultureInfo("en-US"));
}
}
}
catch
{
// Gerek yok hatayi yakalamaya
}
return decSatisFiyati;
}
private decimal dovizFiyatBul(DateTime tarih, string dovizCinsi, string alisSatis)
{
decimal decSatisFiyati = 0;
try
{
string url = Sabitler.UrlDoviz + tarih.ToString("yyyy") + "/" + tarih.ToString("MM") + "/" + tarih.ToString("dd");
HttpClient httpClient = new HttpClient();
string html = httpClient.GetStringAsync(url).Result;
HtmlDocument htmlDocument = new HtmlDocument();
htmlDocument.LoadHtml(html);
HtmlNode dovizDivNode = htmlDocument.DocumentNode.SelectSingleNode("//div[@class='kurlar bordernone' and @title='" + titleGetir(dovizCinsi) + "']");
if (dovizDivNode != null)
{
HtmlNode dolarSatisFiyatiLiNode = dovizDivNode.SelectSingleNode(".//ul/li[@class='midrow " + convertTurkishToEnglish(alisSatis) + "' and @title='" + titleGetir(dovizCinsi) + " - " + alisSatis + "']");
if (dolarSatisFiyatiLiNode != null)
{
string strSatisFiyati = dolarSatisFiyatiLiNode.InnerText.Trim();
decSatisFiyati = decimal.Parse(strSatisFiyati.Replace(",", "."), CultureInfo.GetCultureInfo("en-US"));
}
}
}
catch
{
// Gerek yok hatayi yakalamaya
}
return decSatisFiyati;
}
private string convertTurkishToEnglish(string input)
{
input = input.Replace("İ", "i")
.Replace("I", "i")
.Replace("Ş", "s")
.Replace("Ç", "c")
.Replace("Ğ", "g")
.Replace("Ö", "o")
.Replace("Ü", "u")
.Replace("ı", "i")
.Replace("ş", "s")
.Replace("ç", "c")
.Replace("ğ", "g")
.Replace("ö", "o")
.Replace("ü", "u");
return input.ToLower();
}
private string titleGetir(string dovizAltin)
{
switch (dovizAltin)
{
case Sabitler.Dolar:
return "ABD Doları";
case Sabitler.Euro:
return "Euro";
case Sabitler.Sterlin:
return "İngiliz Sterlini";
case Sabitler.Altin:
return "Gram Altın";
default:
return "";
}
}
}
public class HesaplamaRequest
{
public DateTime Tarih { get; set; }
public string? AltinDovizTuru { get; set; }
public decimal Tutar { get; set; }
}
public struct Sabitler
{
public const string Altin = "ALT";
public const string Dolar = "USD";
public const string Euro = "EUR";
public const string Sterlin = "GBP";
public const string UrlDoviz = "https://altin.in/arsiv-doviz/";
public const string UrlAltinGumus = "https://altin.in/arsiv/";
public const string Alis = "Alış";
public const string Satis = "Satış";
}
}
Selamlar.