@eternl/格式
Locale-aware显示格式化和CSV-安全数字帮助器,用于基于浏览器的仪表板和导出.
安装
npm install @eternl/formats
快速启动
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 }) }
])
生成的 CSV 完全为 ASCII (. 十进制分隔符,不分组),并清洁地导入到Google Sheets, Koinly,和CoinTracking.
显示格式
formatDisplayNumber处理带有分组、可选标志显示和四舍五入控件的本地化小数.formatDisplayCurrency组合Intl.NumberFormat带有可选自定义符号(₳,₿等). 保留了来自主机地块的间距,除非一个自定义符号去掉.formatDisplayPercent在尊重小数和百分比符号的同时, 将显示数字乘以100.formatDisplayCompact应用精确的可配置 K/M/B/T后缀big.js算术(无科学注释).
共同选项 :
{
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 格式化
formatCsvNumber输出平方 ASCII 位数和一个点小数分隔符, 纪念分数/最大小数, 精确度, 并裁剪 .formatCsvPercent将比值乘以100并发出一个无标记的数字字符串( 无)%) (中文(简体) ).csvCurrencyCode将货币符号或代码保存在专栏中,这样数字字段保持干净.
formatCsvNumber('0.00000001', { maxDecimals: 8 }) // "0.00000001"
formatCsvPercent('0.125', { maxDecimals: 4 }) // "12.5"
csvCurrencyCode('btc', { BTC: '₿' }, true) // "₿"
CSV 构建器
buildCsv(rows, columns, delimiter = ',', lineEnding = '\n') 应用分栏存取器和格式化器,引用字段并加上分栏、引文或新行(RFC 4180)。 数字结果 formatCsvNumber 绝不需要引用,所以进口仍然是数字.
约会助手
formatDisplayDate(input, locale, options)缓存Intl.DateTimeFormat实例.formatIsoDate(input, { timeZone })发射YYYY-MM-DD使用请求的时区.formatIsoDateTime(input, { timeZone })以空间分隔符和时区偏移发布 ISO 日期.formatCsvDate(input)发射 ISO-8601 字符串 :YYYY-MM-DD协调世界时午夜,否则YYYY-MM-DD HH:mm:ssZ。 。 。 .
发展
pnpm --filter @eternl/formats typecheck
pnpm --filter @eternl/formats test
pnpm --filter @eternl/formats build
测试套件包括地方差异、四舍五入的边缘外壳、百分比处理、大小尺寸和CSV引用规则.
许可证
商业来源许可证1.1(BUSL-1.1) (中文(简体) ).
额外使用赠款 : None。 。 。 .
商业用途需要从塔斯滕昆斯特获得单独的许可证.
联系人 : https://tastenkunst.com/ (中文(简体) )