Форматирование строки с 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 шт):

Автор решения: p1e0

Может комуто нужен будет тысячный разделитель для 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 });
}
→ Ссылка