input框实现输入数字,根据数据精度,输入过程格式化的方式

该博客介绍了在React中创建一个自定义数字输入框组件,包括验证输入值的精度、范围,并进行格式化处理。组件使用了Ant Design的Input,并提供了错误样式控制、onBlur事件处理等功能,确保输入值符合指定的小数位数、最小值和最大值要求。

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

/**
 *
 * @param value 当前输入值
 * @param precision 保留小数位数
 * @param min 最小值,可控制正负
 * @param max 最大值
 * @returns number 处理后的值
 */
export const validateInput = (
  value,
  precision = 0,
  min?: number,
  max?: number,
) => {
  const _IntegerNumber = () => {
    let str2;
    let reg;
    if (Math.abs(precision) > 0) {
      if (min >= 0) {
        reg = /[^\d\.]/g;
      } else {
        reg = /[^-?\d\.]/g;
      }
    } else {
      if (min >= 0) {
        reg = /[^\d]/g;
      } else {
        reg = /[^-?\d]/g;
      }
    }
    str2 = value.replace(reg, "");
    const arr_ = str2.split("-");
    let str: any;
    if (str2.indexOf("-") > -1) {
      if (arr_.length === 1) {
        str = arr_[0];
      } else if (arr_.length === 2) {
        str = !arr_[1] ? arr_[0] || "-" : "-" + _resolvePoint(arr_[1]);
      } else if (arr_.length === 3) {
        str = "-" + value.replaceAll("-", "");
      }
    } else {
      str = str2;
    }
    let valueTemp = str;
    if (str && str.length > 1 && str[0] === "0") {
      // message.error('请输入合法数字')
      valueTemp = parseFloat(str);
    }
    if (str.indexOf(".") > -1) {
      const arr = str.split(".");
      console.log(
        parseFloat(arr[0]),
        parseFloat(arr[0]) === parseFloat(arr[0]),
      );
      if (arr[1]) {
        valueTemp =
          parseFloat(arr[0]) === parseFloat(arr[0])
            ? parseFloat(arr[0]).toString() +
              "." +
              arr[1].substr(0, Math.abs(precision))
            : parseFloat(arr[1]);
      } else {
        valueTemp = arr[0] + ".";
      }
    }
    return valueTemp;
  };

使用方式

/**
 * @description 数字输入框
 */

import { Input, InputProps } from 'antd'
import styled from 'styled-components'
import _Number from './utils'
import { validateInput } from '@/utils/utils'
import { useEffect, useState } from 'react'

/**
 *
 * @param unit 单位
 * @param value 原数据
 * @description 日:整数,年:一位小数,其他:两位小数
 */
export const FormatNumber = (unit: string, value: string) => {
  if (unit === '日') {
    return value
  }
}

const InputWrapper = styled.div`
  width: 80px;
  margin: 0 8px;
  .ant-input-affix-wrapper {
    padding: 0 0 0 8px;
    border-color: ${(props) =>
      props.isError ? '#E64A00' : '#D4D7DD'} !important;
  }
  .ant-input {
    height: 28px;
    border-color: ${(props) =>
      props.isError ? '#E64A00' : '#D4D7DD'} !important;

    .ant-input {
      height: 27px;
      line-height: 27px;
      padding: 0 8px;
    }
  }
`

interface NewInputNumberProps extends InputProps {
  isError?: boolean // 用来校验为空时的样式
  min?: number // 最小值
  max?: number // 最大值
  precision?: number // 数值精度
}

const SInputNumber = (props: NewInputNumberProps) => {
  const { onChange, min, precision, max } = props
  const [curValue, setCurValue] = useState<number | string | null>()
  let newProps = { ...props }
  delete newProps.isError
  delete newProps.style

  const onChangeNumber = (e) => {
    // 处理后的值
    const res = validateInput(e.target.value, precision, min, max)
    if (curValue?.toString() !== res?.toString()) {
      onChange(res)
    }
    setCurValue(curValue)
  }

  const onBlurNumber = (e) => {
    const res = validateInput(e.target.value, precision, min)
    if (
      res &&
      res?.length > 1 &&
      res.toString().indexOf('.') === res.toString().length - 1
    ) {
      onChange(_Number.toNumber(res))
    }
  }

  useEffect(() => {
    setCurValue(props.value)
  }, [props.value])

  return (
    <InputWrapper isError={props.isError} style={props.style}>
      <Input {...newProps} onChange={onChangeNumber} onBlur={onBlurNumber} />
    </InputWrapper>
  )
}

export default SInputNumber

以下方法引自rc-inputnumber

// '1.' '1x' 'xx' ''  => are not complete numbers
  isNotCompleteNumber: function isNotCompleteNumber(num) {
    return (
      isNaN(num) ||
      num === '' ||
      num.toString().indexOf('.') === num.toString().length - 1
    )
  },
  toNumber: function toNumber(num) {
    if (this.isNotCompleteNumber(num)) {
      return Number(num);
    }
    return num;
  },
### 如何在 Python 中通过 `input` 函数正确输入数字 当使用 Python 的 `input()` 函数接收用户输入时,默认情况下,该函数会将所有输入视为字符串。如果希望处理的是数字,则需要显式地将其转换为整型 (`int`) 或浮点型 (`float`)。 以下是实现这一功能的具体方法: #### 转换为整数 可以使用内置的 `int()` 函数将字符串形式的数字转换为整数。需要注意的是,如果用户输入的内容无法被解析为有效的整数(例如包含字母或其他字符),则会抛出 `ValueError` 异常[^1]。 ```python number = input("请输入一个整数:") try: number_int = int(number) print(f"您输入的整数是: {number_int}") except ValueError: print("错误:输入不是有效整数") ``` #### 转换为浮点数 对于更复杂的场景,比如涉及小数的情况,应使用 `float()` 来代替 `int()` 进行数据类型的转换。同样地,非法输入也会引发异常[^3]。 ```python num1_str = input("请输入第一个浮点数:") num2_str = input("请输入第二个浮点数:") try: num1_float = float(num1_str) num2_float = float(num2_str) result_sum = num1_float + num2_float print(f"{num1_float} 和 {num2_float} 的和是 {result_sum:.2f}") # 输出保留两位小数 except ValueError: print("错误:至少有一个输入不是合法的浮点数") ``` 上述代码展示了如何安全地接受并计算两个浮点数之和的过程,并利用格式化输出使结果显示更加友好[^2]。 --- #### 完整示例:综合应用 下面提供了一个完整的例子,它不仅涵盖了基本的数据类型转换逻辑,还加入了简单的错误提示机制以提高用户体验。 ```python def get_number(prompt, convert_func=float): while True: try: value = input(prompt) converted_value = convert_func(value) return converted_value except ValueError: type_name = '浮点数' if convert_func is float else '整数' print(f"输入有误,请重新输入一个{type_name}") # 主程序调用 if __name__ == "__main__": first_num = get_number("请输入第一个数字 (支持整数或小数): ", float) second_num = get_number("请输入第二个数字:", float) total = first_num + second_num average = total / 2 print(f"\n两数总和为:{total}, 平均值为:{average:.2f}\n") ``` 此脚本定义了一种通用的方法来请求任意数量的有效数值输入,无论它们是以何种精度给出的。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值