Bios.Money 0.2.0
Bios.Money
Para JSON'da her zaman metin gezer: "19900.0000". Bu paket o kuralın
converter'larıdır.
Neden metin: JavaScript'in tek sayı tipi IEEE 754 double'dır ve 0.1 gibi değerleri tam tutamaz. Sayı olarak gönderilen para, tarayıcıya vardığında sessizce bir kuruş kaymış olabilir. Kimse hata görmez; toplam yanlıştır.
Davranış:
- Yazarken
decimaldeğerin her basamağı olduğu gibi çıkar. Yuvarlama yapılmaz; yuvarlama paranın hesaplandığı yerin işidir, yazıldığı yerin değil. - Okurken JSON sayısı reddedilir. Kabul edilen biçim dar: rakamlar, istenirse baştaki işaret, ondalık için nokta. Grup ayracı, üs, boşluk kabul edilmez.
- Ayrıştırma her zaman invariant culture ile yapılır. Türkçe culture'da
decimal.Parse("19900.50")değeri 1990050 okur; bu paket o tuzağa düşmez.
Bağlama
services.AddBiosMoneyJson();
Converter'lar host'un mevcut JSON ayarlarına eklenir, onları değiştirmez. Yapılandırma dosyasından okuduğu bir ayar yoktur; tek çağrı budur.
Yapılandırma
Yok. Paketin okuduğu bir ayar bölümü ve anahtarı bulunmaz.
Dikkat
Converter decimal tipinin kendisine kayıtlıdır, ayrı bir para tipine
değil. Paketin adı bunu düşündürmüyor, ama gerçek olan budur: MoneyConverter
JsonConverter<decimal>, NullableMoneyConverter ise JsonConverter<decimal?>
türevidir. AddBiosMoneyJson çağıran bir host'ta o host'un JSON'una giren
her decimal bu kuraldan geçer, parayla ilgisi olmayanlar dahil:
public sealed record Line
{
public decimal Amount { get; init; } // para -> "19900.0000"
public decimal VatRate { get; init; } // oran, para degil -> "20.00"
public decimal Quantity { get; init; } // miktar -> "3.5"
}
Bu tek yönlü de değildir. Oran ve miktar artık cevapta metin olarak çıkar ve istekte metin olarak gelmek zorundadır; bir oranı JSON sayısı olarak gönderen istemci hata alır. Aynı şekilde bu paketi bağlayan bir host'un sözleşmesini okuyan tarafın, para olmayan ondalıkları da tırnak içinde göndermesi gerekir.
Bu bilinçli bir tercihtir. Ayrı bir para tipi olsaydı ürünün her katmanında sarmalama ve çözme işi doğardı; buradaki takas, o işi hiç yapmamak karşılığında para olmayan ondalıkların da metne dönmesini kabul etmektir. Katlanılabilir olmasının sebebi, tarayıcının oranı ve miktarı da double olarak tutuyor olmasıdır; yani metin gitmeleri oraya da zarar vermez, tersine yardım eder.
Kabul edilmiyorsa çözüm AddBiosMoneyJson'ı hiç çağırmamak, converter'ları
yalnız para taşıyan özelliklere [JsonConverter(typeof(MoneyConverter))] ile
tek tek takmaktır. İki converter de bu yüzden public'tir.
Kayıt yalnız HTTP JSON ayarlarına yapılır. Çağrı içeride
ConfigureHttpJsonOptions kullanır; bu, minimal API uçlarının okuduğu ayar
kümesidir. MVC controller'ları kendi JsonOptions'ını okur, kendi elinle
kurduğun bir JsonSerializerOptions ise ikisini de okumaz. Bu iki yolda
converter'ları oraya ayrıca eklemen gerekir.
No packages depend on Bios.Money.
.NET 10.0
- No dependencies.