@eternl/formats

中文文档
0.55.0发布于 2026/11/10BUSL-1.1TypeScriptESM + CJS近 30 天下载 2428

Locale-aware display and CSV formatting helpers for numeric data.

原始使用文档
文档目录8 节
  1. Installation
  2. Quick Start
  3. Display Formatting
  4. CSV Formatting
  5. CSV Builder
  6. Date Helpers
  7. Development
  8. License

@eternl/formats

Locale-aware display formatting and CSV-safe number helpers for browser-based dashboards and exports.

Installation

npm install @eternl/formats

Quick Start

import Big from 'big.js'
import {
  buildCsv,
  csvCurrencyCode,
  formatCsvDate,
  formatCsvNumber,
  formatCsvPercent,
  formatDisplayCurrency,
  formatDisplayPercent,
  formatDisplayCompact
}                             from '@eternl/formats'

const amount = new Big('1234567.890123')

const priceUS = formatDisplayCurrency(amount, {
  locale: 'en-US',
  currencyCode: 'USD',
  minDecimals: 2,
  maxDecimals: 2,
  useSymbol: true
}) // "$1,234,567.89"

const priceDE = formatDisplayCurrency(amount, {
  locale: 'de-DE',
  currencyCode: 'EUR',
  minDecimals: 2,
  maxDecimals: 2,
  useSymbol: true
}) // "1.234.567,89 €"

const adaDisplay = formatDisplayCurrency('123456789.123456', {
  locale: 'en-US',
  currencyCode: 'ADA',
  customSymbols: { ADA: '₳' },
  minDecimals: 2,
  maxDecimals: 6
}) // "₳123,456,789.123456"
const masked = formatDisplayCurrency('1234.5', {
  locale: 'en-US',
  currencyCode: 'USD',
  minDecimals: 2,
  maxDecimals: 2,
  isHidden: true
}) // "$*.**"

const maskedWithDash = formatDisplayCurrency('1234.5', {
  locale: 'en-US',
  currencyCode: 'USD',
  minDecimals: 2,
  maxDecimals: 2,
  isHidden: true,
  hiddenCharacter: '-'
}) // "$-.--"


const pctDisplay = formatDisplayPercent('0.125', {
  locale: 'en-US',
  minDecimals: 1,
  maxDecimals: 2
}) // "12.5%"

const compact = formatDisplayCompact('9876543', {
  locale: 'en-US',
  compact: true,
  maxDecimals: 1
}) // "9.9M"

const csvNumber = formatCsvNumber(amount, { maxDecimals: 6, trimTrailingZeros: true })
const csvPercent = formatCsvPercent('0.125')
const csvCurrency = csvCurrencyCode('ADA', { ADA: '₳' }, false)

const rows = [
  { ts: new Date('2025-10-06T12:00:00Z'), amount, currency: 'ADA', ratio: '0.125' }
]

const csv = buildCsv(rows, [
  { header: 'date', accessor: (row) => row.ts, formatter: (value) => formatCsvDate(value as Date) },
  { header: 'amount', accessor: (row) => row.amount, formatter: (value) => formatCsvNumber(value as Big, { maxDecimals: 6 }) },
  { header: 'currency', accessor: (row) => row.currency, formatter: (value) => csvCurrencyCode(String(value), { ADA: '₳' }, false) },
  { header: 'percent', accessor: (row) => row.ratio, formatter: (value) => formatCsvPercent(value as string, { maxDecimals: 4 }) }
])

The generated CSV is fully ASCII (. decimal separator, no grouping) and imports cleanly into Google Sheets, Koinly, and CoinTracking.

Display Formatting

  • formatDisplayNumber handles localized decimals with grouping, optional sign display, and rounding controls.
  • formatDisplayCurrency combines Intl.NumberFormat with optional custom symbols (₳, ₿, etc.). Spacing from the host locale is preserved unless a custom symbol removes it.
  • formatDisplayPercent multiplies by 100 for display while respecting locale decimal and percent symbols.
  • formatDisplayCompact applies configurable K/M/B/T suffixes using precise big.js arithmetic (no scientific notation).

Common options:

{
  minDecimals?: number
  maxDecimals?: number
  precision?: number        // significant digits
  roundingMode?: 'roundDown' | 'roundHalfUp' | 'roundHalfEven' | 'roundUp'
  trimTrailingZeros?: boolean (default: false)
  signDisplay?: 'auto' | 'always' | 'exceptZero' | 'never' | 'negative'
  useGrouping?: boolean
  isHidden?: boolean            // mask digits with maskCharacter (default '*')
  hiddenCharacter?: string
}

CSV Formatting

  • formatCsvNumber outputs plain ASCII digits and a dot decimal separator, honoring min/max decimals, precision, and trimming.
  • formatCsvPercent multiplies the ratio by 100 and emits an unadorned numeric string (no %).
  • csvCurrencyCode keeps currency symbols or codes in a dedicated column so numeric fields stay clean.
formatCsvNumber('0.00000001', { maxDecimals: 8 }) // "0.00000001"
formatCsvPercent('0.125', { maxDecimals: 4 })      // "12.5"
csvCurrencyCode('btc', { BTC: '₿' }, true)        // "₿"

CSV Builder

buildCsv(rows, columns, delimiter = ',', lineEnding = '\n') applies per-column accessors and formatters, quoting fields with delimiters, quotes, or newlines (RFC 4180). Numeric results produced by formatCsvNumber never require quoting, so imports remain numeric.

Date Helpers

  • formatDisplayDate(input, locale, options) caches Intl.DateTimeFormat instances.
  • formatIsoDate(input, { timeZone }) emits YYYY-MM-DD using the requested timezone.
  • formatIsoDateTime(input, { timeZone }) emits an ISO date-time with a space separator and timezone offset.
  • formatCsvDate(input) emits ISO-8601 strings: YYYY-MM-DD for midnight UTC, otherwise YYYY-MM-DD HH:mm:ssZ.

Development

pnpm --filter @eternl/formats typecheck
pnpm --filter @eternl/formats test
pnpm --filter @eternl/formats build

The test suite covers locale differences, rounding edge cases, percent handling, large/small magnitudes, and CSV quoting rules.

License

Business Source License 1.1 (BUSL-1.1).

Additional Use Grant: None. Commercial use requires a separate license from Tastenkunst. Contact: https://tastenkunst.com/

版本与发布记录

@eternl/formats 共发布 129 个版本,首次发布于 2025/10/07;过去 12 个月发布了 107 个版本。

版本发布日期距今
0.55.0latest2026/11/103 天前
0.54.02026/11/103 天前
0.53.02026/11/103 天前
0.52.02026/11/103 天前
0.51.02026/11/104 天前
0.50.02026/11/094 天前

关于 @eternl/formats 的常见问题

@eternl/formats 是什么?

Locale-aware display and CSV formatting helpers for numeric data.

如何安装 @eternl/formats?

在项目目录运行 npm install @eternl/formats,或使用 pnpm add / yarn add / bun add。

@eternl/formats 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@eternl/formats 支持 ESM 还是 CommonJS?

同时提供 ES Module 与 CommonJS 入口,import 和 require() 都可以使用,打包工具会自动选择合适的版本。

@eternl/formats 可以商用吗?

@eternl/formats 使用 BUSL-1.1 许可。声明的许可为 BUSL-1.1,请阅读许可原文确认使用条件。以上为概括,不构成法律意见,请以许可原文为准。

@eternl/formats 的下载量有多少?

根据 npm 官方下载统计,@eternl/formats 在 2026/10/14 – 2026/11/12 这 30 天内被下载 2,428 次,日均约 81 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@eternl/formats 还在维护吗?

最新版本 0.55.0 发布于 2026/11/10(3 天前);至今共发布 129 个版本,其中过去 12 个月发布了 107 个;首次发布于 2025/10/07。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。