/* * @Author: yangzonglong * @Date: 2021-09-14 09:37:10 * @version: v1.0.0 * @Descripttion: InputNumber * @LastEditors: yangzonglong * @LastEditTime: 2021-09-15 09:16:14 * @Auditor: */ import React, { memo, useCallback } from 'react'; import { InputNumber as AInputNumber } from 'antd'; import { InputNumberProps as AInputNumberProps } from 'antd/lib/input-number'; type ValueProps = string | number | undefined; const integerDefOptions = { formatter: (value: ValueProps) => value === '0' ? value : String(value).replace(/^(0+)|[^\d]+/g, '') } const amountDefOptions = { formatter: (value: ValueProps) => `${value}`.replace(/(? value ? value.replace(/\$\s?|(,*)/g, '') : '' } const precisionDefOptions = { formatter: (value: string | undefined, precision: number) => { const arr = (value + '').split('.'); if (!arr[1] || arr[1]?.length <= precision) return value; return arr[0] + '.' + arr[1].substring(0, precision); } } export interface InputNumberProps extends AInputNumberProps { isInteger?: boolean; // 为true时只允许输入整数 isAmount?: boolean; // 为true时 格式化成金额 } const InputNumber = (props: InputNumberProps) => { const { isInteger, isAmount, precision, ...inputNumberProps } = props; const _formatter = useCallback((value) => { if (isInteger) return integerDefOptions.formatter(value); if (isAmount) return amountDefOptions.formatter(value); if (precision) return precisionDefOptions.formatter(value, precision); return value }, [isInteger, isAmount, precision]); const _parser = useCallback((value) => { if (isAmount) return amountDefOptions.parser(value); return value }, [isInteger, isAmount]); return ( ) } export default memo(InputNumber);