柯里化实现数值格式化工具的核心是分离格式规则与具体数值:先固定小数位数、分隔符、前缀后缀等参数,再接收数字返回格式化字符串,从而提升复用性与可组合性。

用柯里化实现数值格式化工具,核心是把“格式规则”和“具体数值”分离开:先固定格式参数(如小数位数、千分位符号、前缀后缀),再接收数字并返回格式化后的字符串。这样能复用配置,避免重复传参。
基础柯里化格式化函数
定义一个可柯里化的 formatNumber,支持链式传参:
const formatNumber = (digits = 2) => (separator = ',') => (prefix = '') => (suffix = '') => (num) => {
if (num == null) return '';
const fixed = Number(num).toFixed(digits);
const [integer, decimal] = fixed.split('.');
const intWithSep = integer.replace(/\B(?=(\d{3})+(?!\d))/g, separator);
return `${prefix}${intWithSep}${decimal ? '.' + decimal : ''}${suffix}`;
};
使用示例:
-
formatNumber(2)(',')('$')('')(12345.678)→"$12,345.68" -
formatNumber(0)('.')('€')('')(999999)→"€999.999"
更实用的预设工厂函数
实际开发中,直接柯里化调用略冗长。推荐用柯里化生成常用格式器:
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
const createFormatter = (options) => (num) => {
const { digits = 2, separator = ',', prefix = '', suffix = '', locale } = options;
if (locale) {
return new Intl.NumberFormat(locale, {
minimumFractionDigits: digits,
maximumFractionDigits: digits
}).format(num).replace(/,/g, separator)
.replace(/^/, prefix)
.replace(/$/, suffix);
}
// 回退手动格式化逻辑(同上)
const fixed = Number(num).toFixed(digits);
const [integer, decimal] = fixed.split('.');
const intWithSep = integer.replace(/\B(?=(\d{3})+(?!\d))/g, separator);
return `${prefix}${intWithSep}${decimal ? '.' + decimal : ''}${suffix}`;
};
// 柯里化封装:先配选项,再用
const toUSD = createFormatter({ digits: 2, separator: ',', prefix: '$' });
const toPercent = createFormatter({ digits: 1, suffix: '%' });
const toCN = createFormatter({ locale: 'zh-CN', digits: 2 });
这样调用更自然:
-
toUSD(1234567.89)→"$1,234,567.89" -
toPercent(0.758)→"75.8%" -
toCN(1234567.89)→"1,234,567.89"(中文环境自动适配)
支持部分应用与组合
利用柯里化天然支持“部分应用”的特性,可以灵活组合:
// 先固定小数位和分隔符,留出前缀后缀动态传入
const withTwoDigits = formatNumber(2)(',');
const price = withTwoDigits('$')('')(1999.99); // "$1,999.99"
const amount = withTwoDigits('¥')('')(8888.88); // "¥8,888.88"
// 或用函数组合:柯里化 + 管道
const pipe = (...fns) => (x) => fns.reduce((v, f) => f(v), x);
const toFixed2 = (n) => Number(n).toFixed(2);
const addCommas = (str) => str.replace(/\d(?=(\d{3})+\.)/g, '$&,');
const toCurrency = pipe(toFixed2, addCommas, (s) => `$${s}`);
toCurrency(1234567); // "$1,234,567.00"
注意事项与优化点
柯里化不是银弹,注意以下细节:
-
输入校验不能省:数字转换前应检查
isNaN或用Number.isFinite,避免NaN或Infinity被格式化成意外字符串 - 性能敏感场景慎用深层柯里化:多层箭头函数会增加调用开销;高频格式化(如表格渲染)建议预编译为闭包函数
-
国际化优先用
Intl.NumberFormat:它自动处理 locale 特有的小数点、分隔符、负号位置等,比正则更可靠 -
可考虑搭配 TypeScript:为每层参数标注类型,提升可维护性,例如
(digits: number) => (sep: string) => ...
柯里化在这里的价值不是炫技,而是让格式化行为变得可配置、可复用、可组合。把“怎么做”和“做什么”解耦,后续扩展货币、百分比、字节单位等格式时,只需新增配置,不用动核心逻辑。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










