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 decimal değ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.

Version Downloads Last updated
0.2.0 93 08/29/2026
0.1.0 2 08/29/2026