数字与千分位字符串互转

6 篇文章 0 订阅
4 篇文章 0 订阅

数字转千分位字符串

import { numberFormat } from "format.ts";
numberFormat(2000000); // 2,000,000.00
numberFormat(2000000, 0); // 2,000,000
numberFormat(); // -
numberFormat('20f000,00'); // 2,000,000.00

千分位字符串转数字

import { millageToNumber} from "format.ts";
millageToNumber('12,212,2.1'); // 122122.10
millageToNumber('2,122,122.1'); // 2122122.10

具体方法如下

export function isString(obj: any) {
  return Object.prototype.toString.call(obj) === "[object String]";
}

/*
    * 替换非数字字符串
    * 参数说明:
    * str:要格式化的字符串
    * exclude:是否保留小数点 默认保留
    * */
export function replaceToNumberStr(str: string|number, exclude = true) {
  str = String(str);
  if (exclude) return str.replace(/[^0-9.]/ig,"");
  return str.replace(/[^0-9]/ig,"")
}

/*
    * 保留固定小数位数
    * 参数说明:
    * n:要格式化的数字
    * decimals:保留小数点位数 默认2
    * */
export function toFixedFix(n: number|string, decimals = 2) {
  const reg = new RegExp('^[0-9]+(?:.[0-9]{0,'+ decimals +'})?')
  const number: any = String(n).match(reg);
  return '' + number;
}

 /*
  * 保留固定小数位数, 少于小数位数用0填充
  * 参数说明:
  * number:要格式化的数字
  * decimals:保留几位小数位数 默认2
  * */
export function toFixedNumber(number: number|string, decimals = 2) {
  const s: string[] = (decimals ? toFixedFix(number, decimals) : '' + Math.round(Number(number))).split('.');
  if ((s[1] || '').length < decimals) {
    s[1] = s[1] || '';
    s[1] += new Array(decimals - s[1].length + 1).join('0');
  }
  return s.join('.');
}

 /*
  * 千分位格式化数字
  * 参数说明:
  * number:要格式化的数字
  * decimals:保留几位小数
  * dec_point:小数点符号
  * thousands_sep:千分位符号
  * zero_format: 0值格式
  * */
export function numberFormat(number: number|string, decimals = 2, dec_point = '.', thousands_sep = ',', zero_format = '0') {
  // 处理不存在数字返回内容
  if (!number) {
    if (zero_format === '0') {
      return Number(zero_format).toFixed(decimals);
    } else {
      return zero_format;
    }
  }

  let isNeg = false;
  if (String(number).startsWith('-')) isNeg = true;

  if (isString(number)) {
    number = replaceToNumberStr(number);
  } else {
    number = Math.abs(Number(number));
  }
  number = (number + '').replace(/[^0-9+-Ee.]/g, '');

  const n = !isFinite(+number) ? 0 : +number,
  prec = !isFinite(+decimals) ? 0 : Math.abs(decimals),
  sep = (typeof thousands_sep === 'undefined') ? ',' : thousands_sep,
  dec = (typeof dec_point === 'undefined') ? '.' : dec_point;

  const s: string[] = (prec ? toFixedFix(n, prec) : '' + Math.round(n)).split('.');
  const re = /(-?\d+)(\d{3})/;
  while (re.test(s[0])) {
    s[0] = s[0].replace(re, "$1" + sep + "$2");
  }
  
  if ((s[1] || '').length < prec) {
    s[1] = s[1] || '';
    s[1] += new Array(prec - s[1].length + 1).join('0');
  }

  return (isNeg ? '-' : '') + s.join(dec);
}

 /*
  * 千分号转数字
  * 参数说明:
  * number:要格式化的数字
  * decimals:保留几位小数
  * zero_format: 转0的字符
  * */
export function millageToNumber(number: number|string, decimals = 2, zero_format = '-') {
  if (!number || number === zero_format) return 0;
  if (isString(number)) {
    // 替换非数字字符串
    number = replaceToNumberStr(number);
    // 自动补全数字
    number = toFixedNumber(number, decimals);
  }
  return number;
}

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值