Форматирование строки с input в дробь с двумя знаками после разделителя, динамически
Здраствуй, есть вопрос, как можно форматировать строку из input (я использую Form.Control от React) в вид дроби (без букв, символов, кроме точки, ну и если возможно с запятой) Например:
- Ввод Вывод(Правильно)
- 1 1
- 12 12
- 123 123
- 1234 1234
- 1234.5 1234.5
- 1234.56 1234.56
- 1234.5678 1234.56
- 123.4567 123.45
(Извените за форматирование)
Было замечательно если могли бы подсказать как можно сделать форматирование как у валют
например: 1,234,567.89 12,345.6 1,234 123
Не коректные данные 1.1. 0.. ..1 .1. 1111.111.1
И да, код который получает даные значение:
<Form.Group controlId='formGridAmount' as={Col}>
<Form.Label>Amount</Form.Label>
<Form.Control
autoComplete='off'
name='Amount'
type='text'
value={ Amount }
onChange={e => {
setAmount(e.currentTarget.value)
}}
required={!isSearch}
disabled={!props.limit.active}
/>
</Form.Group>
Я как понимаю можно использовать регулярное выражение но как сделать чтобы ето было динамически т. е. сразу когда пишет пользовать отображалось даное число (напр. пользователь пишет число без . 12345678 и устанавливаеться значение 12,345,678(если с запятой ) а если 123456.78 -> 123,456.78)
Ответы (1 шт):
Может комуто нужен будет тысячный разделитель для input type=text В Form.Control
onChange={e => {
setAmount(formatAmountFromLimit(e.currentTarget.value))
}}
export const formatAmountFromLimit = (limitAmount) => {
if (isNaN(limitAmount)) {
let allow = /[a-z]|[^\d\.\,]/gi.exec(limitAmount)
let dot = /\./g.exec(limitAmount)
if (allow != null)
limitAmount = limitAmount.slice(0, allow.index) + limitAmount.slice(allow.index+1)
if (dot != null)
limitAmount = limitAmount.slice(0, dot.index) + limitAmount.slice(dot.index+1)
}
if( limitAmount[limitAmount.length-1]==='.' ) {
if (limitAmount[limitAmount.length - 2] === '.')
limitAmount = limitAmount.slice(0, -1)
return Number(limitAmount).toString().replace(/\B(?<!\.\d)(?=(\d{3})+(?!\d))/g, ",")+'.'
}
if (/(\.\d{3,})?$/.exec(limitAmount)[0].length > 0)
limitAmount = limitAmount.slice(0, -1)
return Number(limitAmount).toLocaleString('en-US', { maximumFractionDigits: 2 });
}