数字加千分位分隔符,加货币符号,数字转百分数

本文介绍了如何利用JavaScript的Intl对象解决数字格式化、精度问题和货币符号等问题,提供了一个自定义的parseNumber函数,让前端处理数值计算更精准高效。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

想必大家在做前端开发的过程中或多或少都会需要显示数字或是金钱,或是百分数,或是小数位取有效数字。Number.parseFloat(x).toFixed(2)或许可以解决取有效数字的问题,但是其他的就没辙了。尤其是js的浮点数计算不精确导致在前端计算合适麻烦,还需要引用第三方库来解决,最后导致怕麻烦的童鞋有时候就直接叫后端直接传计算后的值^ _ ^ |||,其实官方已经提供了api去解决类似问题了,而且还是一起解决的,接下来抛转引玉大家一起来学习一下这个api,Intl !!!
去看Intl详情请戳

Intl 对象是 ECMAScript 国际化 API 的一个命名空间,它提供了精确的字符串对比、数字格式化,和日期时间格式化。Collator,NumberFormat 和 DateTimeFormat 对象的构造函数是 Intl 对象的属性。本页文档内容包括了这些属性,以及国际化使用的构造器和其他语言的方法等常见的功能。

我自己封装了一个方法去处理以上这些问题,当然,只是初略封装,感兴趣的童鞋可以继续封装。话不多说,直接上代码!

/**
 * 
 * @param  value :数字/数字字符串
 * @param  config :
 * config = {
      locales: 'zh-CN',
      currency: 'CNY', 是否显示币种前缀,默认不显示 
      注:currency如果有值,需和locale对应
      fractionDigits: 2, 显示多少位小数,默认2位小数
      useGrouping: false, 千分位逗号分隔 true/false ,默认true
      percent: 2 显示百分号和最高几位小数
    }
 * @returns string 格式化后的数字
 */
function parseNumber (value, config) {
  if (isNaN(value)) return '???'
  if ([null, undefined, '',].includes(value)) return '-' // 没有值时返回‘-’
  if (value == 0) return '0' // 对于0,0.0000,-0.000...这些直接返回0不保留小数位
  let locales = undefined
  let options = {}
  // 1. 如果有配置,使用配置
  if (config) {
    if (Reflect.has(config, 'locales')) {
      locales = config.locales
    }
    // 1.2 千分位逗号分隔
    if (Reflect.has(config, 'useGrouping')) {
      options.useGrouping = config.useGrouping
    }
    // 1.3 加币种前缀
    if (Reflect.has(config, 'currency')) {
      options.style = 'currency'
      options.currency = config.currency
    }
    // 1.4 是否有小数位,显示多少位小数
    if (Reflect.has(config, 'fractionDigits')) {
      options.minimumFractionDigits = config.fractionDigits
      options.maximumFractionDigits = config.fractionDigits
    }
    // 1.5 设置为百分数格式
    if (Reflect.has(config, 'percent')) {
      options.style = 'percent'
      options.maximumFractionDigits = config.percent
    }
  } else {
    // 2. 没有配置使用默认配置,对金钱默认处理为"1,234,567.89";
    locales = 'zh-CN'
    options.minimumFractionDigits = 2
    options.maximumFractionDigits = 2
  }
  const nf = new Intl.NumberFormat(locales, options)
  return nf.format(value)
}

// 以下是测试数据,可删除
const test = [null, undefined, '', {}, 'aa', '111aaa', [],
  0, 0.0, 0.0000, -0.0,
  '0', '0.0', '0.000', '-0.0',
]
test.forEach(item => console.log(parseMoney(item)))
// 以上是测试数据,可删除

简单说明一下:

  1. 传值不是数字或数字字符串时,返回‘???’
  2. 对于==0 的数字,咱没必要再显示小数位或是百分号了,直接返回 0
  3. 传参value不仅仅只是一个数字,也可以是0.1+0.2这种表达式,把前端计算交给Intl去处理,在js中0.1+0.2 =0.30000000000000004的情况,在Intl中不会出现,放心使用!
  4. 具体的使用方法在代码中都有注释,我就不过多废话了!
    有问题的小伙伴欢迎留言,评论,点赞关注,谢啦!!!

谁能仅靠十年寒窗苦读,去经营百岁人生?
活到老,学到老!
知识改变人生!
共勉!

<think>好的,用户现在问的是如何把字换为数字,但之前的对话是关于他们在使用ECharts时遇到的数据类型问题,所有的数值数据都是字串,导致图表无法正确显示。用户可能是在处理类似的问题,或者在另一个项目中遇到了需要将字数字的情况。 首先,我需要回顾之前的解决方案,用户可能已经应用了那些方法,但现在可能需要更全面的指南,或者他们遇到了其他换问题。比如,可能有特殊字、不同的格式(如货币符号千分位分隔符),或者处理非数字串时的错误处理。 接下来,用户的需求可能不仅仅是基本的换,而是需要确保换的准确性和鲁棒性。他们可能在数据清洗、前端表单处理、API响应解析等场景下遇到这个问题。需要覆盖不同的换方法,以及如何处理各种边缘情况,比如空值、无效字、科学计数法等。 同时,用户可能对JavaScript中的换机制不太清楚,比如parseInt、parseFloat、Number()的区别,或者隐式类型换的陷阱。需要解释这些方法的差异,并提供最佳实践建议,避免常见的错误,比如NaN的问题。 还要考虑用户可能是在不同的环境中工作,比如Node.js后端或者前端JavaScript,不同的环境可能需要不同的处理方式,但核心的换方法应该是通用的。另外,可能需要提到类型检查,比如使用typeof或者Number.isNaN来验证换结果。 需要提供代码示例,展示各种换方法的具体使用,以及如何处理异常情况。此外,应该包括数据清洗的步骤,比如使用正则表达式去除非数字,处理千分位逗号,或者替换货币符号。 最后,用户可能需要一个综合的解决方案,比如创建一个工具函数来安全地换字串到数字,处理各种可能的边缘情况,并确保返回有效的数值,避免NaN的情况。同时,提醒用户注意换过程中的精度问题,比如浮点数计算的不准确性,以及如何处理大数字带来的精度丢失。 总结一下,回答需要覆盖不同换方法、处理特殊字、错误处理、数据清洗、工具函数示例以及注意事项,确保用户能够全面理解并应用正确的字串到数字换方法。</think>以下是**字数字的完整技术指南**,涵盖主流场景和潜在问题处理: --- ### $$核心方法对比$$ | 方法 | 语法示例 | 适用场景 | 注意事项 | |------|---------|---------|---------| | `Number()` | `Number("123.45")` | 标准数字换 | 遇到非数字返回NaN | | `parseInt()` | `parseInt("123px", 10)` | 提取整数部分 | **必须指定进制参数** | | `parseFloat()` | `parseFloat("3.14cm")` | 提取浮点数 | 自动忽略末尾非数字 | | 一元运算 | `+"99"` | 快捷换 | 性能最优但可读性差 | | `Math`方法 | `Math.floor("12.7")` | 强制取整 | 会先执行Number换 | --- ### $$实战代码模板$$ **场景1:带格式的字串** ```javascript // 处理货币/单位 const priceStr = "¥1,234.56元"; const num = Number(priceStr.replace(/[^0-9.-]/g, '')); // 1246.56 // 处理百分比 const percentStr = "85%"; const decimal = parseFloat(percentStr) / 100; // 0.85 ``` **场景2:科学计数法处理** ```javascript const sciStr = "2.5e3"; console.log(Number(sciStr)); // 2500(自动解析) ``` **场景3:安全换函数** ```javascript function safeConvert(str) { // 1. 清理非数字(保留负号和小数点) const cleaned = String(str).replace(/[^0-9.-]/g, ''); // 2. 防止多个小数点 const hasMultipleDots = (cleaned.match(/\./g) || []).length > 1; const validStr = hasMultipleDots ? cleaned.replace(/\.+$/, '') : cleaned; // 3. 换并验证 const num = parseFloat(validStr); return Number.isNaN(num) ? 0 : num; } ``` --- ### $$错误处理方案$$ **问题1:空值/undefined** ```javascript const input = undefined; const num = Number(input || 0); // 0 ``` **问题2:非法数字格式** ```javascript function advancedConvert(str) { try { return new Function(`return ${str}`)(); } catch { return 0; } } console.log(advancedConvert("12+34")); // 46(慎用eval类方法) ``` --- ### $$性能优化技巧$$ 1. **预处理正则缓存**: ```javascript // 初始化时预编译正则 const numberCleanRegex = /[^0-9.-]/g; // 使用时直接调用 const cleanStr = "¥123".replace(numberCleanRegex, ''); ``` 2. **类型推断优化**: ```javascript function smartConvert(value) { if (typeof value === 'number') return value; if (typeof value !== 'string') return Number(value) || 0; return parseFloat(value) || 0; } ``` --- ### $$特殊场景处理$
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值