Sumy a presnosť
Suma v najmenších jednotkách je vždy kanonický celočíselný reťazec: 0 alebo voliteľné mínus a najviac 65 platných číslic (Money::MAX_DIGITS) — bez znamienka plus, úvodných núl, medzier, bodky či exponentu. minor() vracia vždy len túto gramatiku.
$big = Money::ofMinor('123456789012345678901234567890', 'EUR');
$big->digits(); // 30
$big->fitsInt(); // false
$big->minorInt(); // throws AmountOverflow — no silent (int) path
// Never compare raw minors in PHP: numeric strings go through float above int64
$a->minor() > $b->minor(); // unreliable for large amounts
$a->isGreaterThan($b); // always exact
Money::ofMinor('007', 'EUR')->minor(); // "7" — normalized on entry
Money::ofMinor('5.0', 'EUR'); // throws InvalidAmount — minors are integers- Surové sumy nikdy nepretypujte cez (int) ani neporovnávajte v PHP — PHP porovnáva číselné reťazce nad int64 cez floaty. Použite porovnávacie metódy Money.
- minorInt() je jediný most na int; mimo int64 vyhodí AmountOverflow a fitsInt() vám to povie vopred.
- JSON prenáša minor ako reťazec: JavaScript poškodí JSON číslo nad 2⁵³.
- Celočíselné vstupy sa pri vstupe normalizujú („007“ → „7“, „-0“ → „0“); „+5“, „ 5“, „5.0“ a „5e3“ vyhodia InvalidAmount.
Limity
| Hranica | Hodnota | Výnimka |
|---|---|---|
| Číslice najmenších jednotiek v pamäti | 65 | AmountOverflow |
| Číslice desatinného vstupu | 90 | InvalidAmount |
| Vstup parsera (znaky) | 128 | InvalidAmount |
| Počet častí split() | 1..10 000 | InvalidAllocation |
| Škály (MinorUnits, ofScaled, toScaled) | 0..36 | InvalidAmount |
| Exponent vlastnej meny | 0..18 | InvalidCurrency |
| Členy pomeru po skrátení (číslice) | 80 | InvalidRatio |
| Uložené číslice (schema.precision) | 38 | InvalidMoneyValue |
Databázové stĺpce
$table->money() vytvorí znamienkový stĺpec sumy decimal(P, 0) (P = money.schema.precision, predvolene 38) a stĺpec meny. Decimal dáva natívne číselné ORDER BY, rozsahové filtre aj presné SUM — bigint by vrátil strop int64 a varchar radí „9“ za „10“.
| Databáza | Stĺpec | PDO vráti | Mimo rozsahu |
|---|---|---|---|
| PostgreSQL | numeric(38,0) | reťazec „1050“ | chyba numeric_value_out_of_range |
| MySQL / MariaDB | decimal(38,0) | reťazec „1050“ | Chyba rozsahu v strict móde (non-strict MySQL nie je podporované) |
| SQLite | numeric | int 1050 | Potichu by sa zmenilo na REAL — cast preto odmietne sumy nad int64 |
Škála je vždy 0 — exponent je v registri mien, takže jeden stĺpec udrží riadky v JPY (0), EUR (2) aj ETH (18). Pre stĺpce veľkosti int64 znížte money.schema.precision na 19; Currency::maxMajorAmount() vráti najväčšiu uložiteľnú sumu:
Currency::of('EUR')->maxMajorAmount(19); // "99999999999999999.99"Prejavte lásku k open source
Tento balík je zadarmo pod licenciou MIT. Ak vám šetrí čas, jednorazový príspevok alebo členstvo na Patreone nám pomôže ho ďalej udržiavať, testovať a dokumentovať.
Ďalšie spôsoby podpory vrátane kryptomienOdoslaním daru súhlasíte s našimi podmienkami prijímania darov.
Chcete to zabudovať do svojho produktu?
Naše balíky integrujeme do zákazkových Laravel a AI riešení. Napíšte nám, na čom pracujete, a ozveme sa do 48 hodín.