You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
34 lines
1.0 KiB
34 lines
1.0 KiB
const SATS_PER_BTC = 100_000_000 |
|
|
|
export function satsToBtc(sats: number): number { |
|
return Math.max(0, sats) / SATS_PER_BTC |
|
} |
|
|
|
export function satsToUsd(sats: number, btcUsd: number): number { |
|
return satsToBtc(sats) * btcUsd |
|
} |
|
|
|
/** Human-readable BTC equivalent (e.g. 0.0021 BTC). */ |
|
export function formatBtcFromSats(sats: number): string { |
|
const btc = satsToBtc(sats) |
|
if (btc === 0) return '0 BTC' |
|
const maxFrac = btc >= 1 ? 4 : btc >= 0.01 ? 6 : 8 |
|
const num = btc.toLocaleString(undefined, { |
|
minimumFractionDigits: 0, |
|
maximumFractionDigits: maxFrac |
|
}) |
|
return `${num} BTC` |
|
} |
|
|
|
/** USD equivalent; returns null when no rate is available. */ |
|
export function formatUsdFromSats(sats: number, btcUsd: number | null): string | null { |
|
if (btcUsd == null || !Number.isFinite(btcUsd) || btcUsd <= 0) return null |
|
const usd = satsToUsd(sats, btcUsd) |
|
const maxFrac = usd >= 1 ? 2 : 4 |
|
return new Intl.NumberFormat(undefined, { |
|
style: 'currency', |
|
currency: 'USD', |
|
minimumFractionDigits: 2, |
|
maximumFractionDigits: maxFrac |
|
}).format(usd) |
|
}
|
|
|