import React from 'react'
import { InputNumber } from 'antd'
import BigNumber from 'bignumber.js'
import { isString, isExist, isNumber, isBigNumber, isNumberString } from '@fexd/tools'
import { Hook } from '@fexd/pro-utils'
import useLocales from '../../locales'
import { ProFieldValueFieldType } from '../../types'
import { defineTypes, ProFormValueTypeMapConfig } from '../types-define'
import useNumberFormat, { numberFormat } from './useNumberFormat'
const normalizeNumberValue = (value: any) => {
if (isBigNumber(value)) {
return BigNumber(value).toFormat({ decimalSeparator: '.' })
}
if (isNumberString(value)) {
return Number(value)
}
return value
}
const number: ProFormValueTypeMapConfig = {
renderField: ({ fieldProps: props = {} } = {}) => (
{(props) => {
const { t } = useLocales(({ t }) => [t])
return
}}
),
renderView: (value, config: ProFieldValueFieldType) => (
{() => {
const numberFormat = useNumberFormat(config)
return isExist(value) ? numberFormat(value) : '--'
}}
),
normalizeValue: normalizeNumberValue,
}
const types = defineTypes({
// 数字输入框
digit: number,
number,
// 金额输入框
money: {
renderField: ({ fieldProps: props = {} } = {}) => (
{(props) => {
const { t } = useLocales(({ t }) => [t])
// const numberFormatConfig = useNumberFormatConfig(true)
return (
numberFormat(value, {
locale: 'en',
})
}
parser={(value) => value!.replace(/\$\s?|(,*)/g, '')}
{...props}
/>
)
}}
),
renderView: (value, config: ProFieldValueFieldType) => (
{() => {
const numberFormat = useNumberFormat(config, true)
if (!isExist(value)) {
return '--'
}
const formatResult = numberFormat(value)
// 如果格式化结果与原数据相同,视作格式化失败,不添加单位
if (formatResult === value) {
return value
}
if (!isExist(config?.unit)) {
return formatResult
}
return (
<>
{config?.unit} {formatResult}
>
)
}}
),
normalizeValue: normalizeNumberValue,
},
percent: {
renderField: ({ fieldProps: props = {} } = {}) => (
{(props) => {
const { t } = useLocales(({ t }) => [t])
return (
{
const result =
!isString(value) || value?.length === 0 || value === '-'
? value
: BigNumber(value).multipliedBy(100).toFormat({ decimalSeparator: '.' })
// console.log('formatter', { value, result })
return result
}}
parser={(value) => {
const result =
!isString(value) || value?.length === 0 || value === '-'
? value
: BigNumber(value).div(100).toFormat({ decimalSeparator: '.' })
// console.log('parser', { value, result })
return result
}}
step={0.01}
{...props}
/>
)
}}
),
renderView: (value, config: ProFieldValueFieldType) => (
{() => {
const numberFormat = useNumberFormat(config)
if (!isExist(value)) {
return '--'
}
if (!isString(value) && !isNumber(value)) {
return value
}
return `${numberFormat(BigNumber(value).multipliedBy(100).toFormat({ decimalSeparator: '.' }))} %`
}}
),
normalizeValue: normalizeNumberValue,
},
})
export default types