首页 > 其他分享 >js将字符串格式化为字符串形式的数字(允许负数)

js将字符串格式化为字符串形式的数字(允许负数)

时间:2024-06-13 10:22:12浏览次数:13  
标签:isNaN return const Number js int 字符串 格式化 小数

本人在制作金额输入框时,由于数字数字框的右侧按钮难处理,所以使用文本输入框接收金额数字,这个函数是用来格式化与校验金额输入.

代码还不够优雅,望指点

/**
 * 将字符串格式为一个合规的字符串数字
 * @param {string} value 字符串大概率是数字字符串
 * @param {boolean} negative 是否允许负数
 * @return {string} "999999999.99"
 */
export function strFormatStrNum(value, negative = false) {
  // 初始检测最容易出错的值
  if (negative) {
    // 初始输入有可能输入0-或者符号需要初始化
    if (value === '0-' || value === '-') {
      // 归零 注意js中有负数零存在
      return '-0'
    }
  }
  // -9代表数字上限为亿位数,-8代表数字上限为千万位数,-2代表数字上限为十位数,想要加大上限就加深负数
  const accuracy_upper_limit = -9
  // 2代表数字只保留小数点后两位
  const accuracy_lower_limit = 2
  // 需要返回的是负数
  const if_negative = negative && value.charAt(0) === '-'

  // 声明切割值保存的数组
  let parts = []
  /*
   * 将value切割成指定格式的字符串数组
   * 有可能输入的值不是字符串形式所以需要toString
   * e也会被判断为数字所以需要删除e
   * 0b判断为二进制数字删除b
   * 0o判断为八进制数字删除o
   * 0x判断为十六进制数字删除x
   * 默认清除负数所以也要删除-
   * split('.')切割为数组
   */
  parts = value
    .toString()
    .replace(/e/g, '')
    .replace(/b/g, '')
    .replace(/o/g, '')
    .replace(/x/g, '')
    .replace(/-/g, '')
    .split('.')

  // 内部函数定义数值初始化
  function strInit() {
    if (if_negative) {
      // -0 === 0 返回 true
      return '-0'
    } else {
      return '0'
    }
  }

  // 进行上限切割后数字化转化
  const int = Number(parts[0].slice(accuracy_upper_limit))

  // 获取整形部分
  function getStrInt() {
    // 需要返回负数的话,需要加回负号
    return if_negative ? '-' + String(int) : String(int)
  }

  // 是否有小数,小数数组长度为2,如果不需要小数那就只对整数判断
  if (parts.length === 1 || accuracy_lower_limit === 0) {
    // 整数情况
    // 数字化的结果有可能是非数值
    if (Number.isNaN(int)) {
      // 初始化
      return strInit()
    } else {
      // 数字化后不是NaN转回字符串
      return getStrInt()
    }
  } else {
    // 有小数情况
    // 切割出指定位数小数
    const decimal = parts[1].slice(0, accuracy_lower_limit)
    // 小数单独进行数字化
    // const double = Number(decimal)
    const regex = /^\d+$/
    // 判断是否有一边数字为NaN
    // !Number.isNaN(int) && !Number.isNaN(double)
    if (!Number.isNaN(int) && regex.test(decimal)) {
      // 两边的数字都不为NaN
      // 右边不使用double是要考虑到.01的这种情况,.01会转为1
      // 2024-06-13修改,由于之前没有考虑到小数后输入字母现在加上正则,regex只允许0-9
      return getStrInt() + '.' + decimal
    } else if (!Number.isNaN(int)) {
      // 只有整数部分是正常的话,不加.会导致用户无法输入小数
      // 2024-06-13修改,之前的三元表达式由于字符串连接 (+) 运算符的优先级高于比较运算符导致没有正确执行,现在加上括号提权
      return getStrInt() + (accuracy_lower_limit > 0 ? '.0' : '')
    } else {
      // 初始化
      return strInit()
    }
  }
}

2024-06-13修复小数部分格式化与代码
旧代码

  } else {
    // 有小数情况
    // 切割出指定位数小数
    const decimal = parts[1].slice(0, accuracy_lower_limit)
    // 小数单独进行数字化
    const double = Number(decimal)
    // 判断是否有一边数字为NaN
    if (!Number.isNaN(int) && !Number.isNaN(double)) {
      // 两边的数字都不为NaN
      // 右边不使用double是要考虑到.01的这种情况,.01会转为1
      return getStrInt() + '.' + decimal
    } else if (!Number.isNaN(int)) {
      // 只有整数部分是正常的话,不加.会导致用户无法输入小数
      return getStrInt() + accuracy_lower_limit > 0 ? '.0' : ''
    } else {
      // 初始化
      return strInit()
    }
  }

新代码

  } else {
    // 有小数情况
    // 切割出指定位数小数
    const decimal = parts[1].slice(0, accuracy_lower_limit)
    // 小数单独进行数字化
    // const double = Number(decimal)
    const regex = /^\d+$/
    // 判断是否有一边数字为NaN
    // !Number.isNaN(int) && !Number.isNaN(double)
    if (!Number.isNaN(int) && regex.test(decimal)) {
      // 两边的数字都不为NaN
      // 右边不使用double是要考虑到.01的这种情况,.01会转为1
      // 2024-06-13修改,由于之前没有考虑到小数后输入字母现在加上正则,regex只允许0-9
      return getStrInt() + '.' + decimal
    } else if (!Number.isNaN(int)) {
      // 只有整数部分是正常的话,不加.会导致用户无法输入小数
      // 2024-06-13修改,之前的三元表达式由于字符串连接 (+) 运算符的优先级高于比较运算符导致没有正确执行,现在加上括号提权
      return getStrInt() + (accuracy_lower_limit > 0 ? '.0' : '')
    } else {
      // 初始化
      return strInit()
    }
  }

标签:isNaN,return,const,Number,js,int,字符串,格式化,小数
From: https://www.cnblogs.com/xd422/p/18245329

相关文章

  • 地球主题网页设计题材——大学生网页制作期末作业HTML+CSS+JS
    ......
  • M1 Mac上运行旧版本的Node.js解决方案
    在M1Mac上运行旧版本的Node.js确实可能会遇到兼容性问题,因为某些旧版本的Node.js并不直接支持ARM架构。但是可以使用Rosetta2解决使用Rosetta2:M1Mac提供了Rosetta2,这是一种转换层,可以允许在ARM架构上运行为Intelx86架构编译的软件。通过在终端使用arch-x86_64前缀......
  • 代码随想录算法训练营第八天 | 344.反转字符串 541.反转字符串Ⅱ 卡玛网:54.替换数字
    344.反转字符串题目:编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组s的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用O(1)的额外空间解决这一问题。解题:思路:双指针,秒了点击查看代码classSolution:defreverseString......
  • Python3 笔记:字符串的 replace() 和 expandtabs()
    1、replace()方法把字符串中的old(旧字符串)替换成new(新字符串),如果指定第三个参数max,则替换不超过max次。语法:str.replace(old,new[,max])参数:old:将被替换的子字符串。new:新字符串,用于替换old子字符串。max:可选参数,如果填写则表示替换不超过max次。str1='old......
  • golang 字节级操作和字符串的区别与转换 []byte(message)
     []byte(message)将字符串message转换为一个字节切片([]byte)。在Go语言中,字符串是不可变的,而字节切片可以被修改。这种转换常用于处理字符串的字节级操作,如编码、解码或写入IO流。 字节级操作和字符串操作在编程中有本质的不同,主要体现在以下几个方面:1.数据单位:......
  • 032指针学习—引用字符串
    目录1.字符串的引用方式(1)两种方法(2)举例(3)注意事项2.字符指针作函数参数(1)说明(2)举例(3)注意事项3.用字符指针变量和字符数组的比较1.字符串的引用方式(1)两种方法        用字符数组存放一个字符串,可以通过数组名和下标引用字符串中一个字符,也可以通过数组名和格......
  • 怎么使用join将数组转为逗号分隔的字符串
    在JavaScript中,你可以使用Array.prototype.join()方法将一个数组转换为逗号分隔的字符串。join()方法接受一个可选的参数,该参数指定了数组元素之间的分隔符。如果不提供参数,则默认使用逗号(,)作为分隔符。下面是一个使用join()方法的例子:letarray=['apple','banana','cher......
  • QTime序列化时间处理(字符串与秒、毫秒互转)
    秒转为时、分、秒格式inttime_sec=11320;QStringtime=QTime(0,0,0).addSecs(static_cast<int>(time_sec)).toString(QString::fromLatin1("HH:mm:ss"));qDebug()<<time;//输出:"03:08:40"毫秒转为时、分、秒、毫秒格式inttime_ms=211320;QString......
  • 最详细的JS学习笔记(连载)第二章、函数(参数)
    4、函数的参数(1)、函数的参数是什么函数的参数是用一个数组来表示的,可以在函数内部通过arguments对象来访问,但是arguments不是一个Array实例;(2)、形参和实参形参:定义在函数名后面小括号中的变量叫做形参变量。定义了形参,也不一定非要给他传值,如果定义了,但是执行的时候......
  • 利用cJSON库解析http返回参数
    利用cJSON库解析http返回参数在C语言中,使用cJSON库来解析HTTP响应返回的JSON参数通常涉及几个步骤:发送HTTP请求(可以利用soket库进行http请求)接收HTTP响应的数据将接收到的数据作为字符串传递给cJSON库进行解析使用cJSONAPI访问和提取JSON数据以下是一个示例,展示了如何使......