Regex заменить запятыми в тысячах

1

У меня есть функция Javascript, которую я использую, чтобы прокрутить кучу входов на странице и преобразовать их в тысячную совместимую систему запятой. Короче говоря, независимо от того, что пользователь вводит в поле, они получат дружественный номер с тысячами разделов.

Input: 5000
Return: 5,000

Здесь, как функция ломается

function add_commas()
{
    $('.field-group .field input[type=text]').each(function()
    {
        // format number
        $(this).val(function(index, value) {
            return value
            .replace(/\D/g, "")
            .replace(/\B(?=(\d{3})+(?!\d))/g, ",")
            ;
        });
    });
}

Все работает правильно, за исключением одного. Вот еще один пример данных, переданных и возвращаемых:

Input: 9.5
Return: 95

Обратите внимание на целое число.

Мне интересно, есть ли способ игнорировать или оставить десятичное число, если у него его нет, но сохраните его и относитесь к нему с уважением, если он есть. Здесь ввод/вывод, на который я надеюсь:

Input: 5000
Return: 5,000

Input: 9.5
Return: 9.5

Input: 1000.50
Return: 1,000.50

Надеюсь, это было ясно, но, пожалуйста, дайте мне знать, если вам потребуется дополнительная информация об этой проблеме. Спасибо!

  • 1
    .replace(/\D/g, "") это .replace(/\D/g, "") должно быть .replace(/[^0-9\.]/g, "")
  • 1
    Я думаю, что вы должны использовать вместо toLocaleString
Теги:

2 ответа

2

Измените первую замену, потому что она удаляет точку в строке

.replace(/[^0-9\.]/g, "")
  • 1
    Работал как шарм, как только вы обновили свой комментарий. Это прекрасно работает сейчас. Спасибо вам большое! Спас мой бекон сегодня вечером :)
  • 0
    Не будет ли полученная функция ставить запятые справа от десятичного знака? Например, «1234.5678» форматируется как «1 234,5 678».
Показать ещё 1 комментарий
2

На самом деле регулярные выражения не подходят для этой проблемы, потому что не каждая культура использует запятые как разделители тысяч и периоды для разделителя оснований. Вы должны использовать toLocaleString. В узле, например:

> (52342.214).toLocaleString()
'52,342.214'
> (52342.214).toLocaleString('de-DE')
'52.342,214'
> (52342.214).toLocaleString('ar-EG')
'٥٢٬٣٤٢٫٢١٤'
> (5234289877.21).toLocaleString('en-US')
'5,234,289,877.21'

Таким образом, вам не нужно писать свой собственный код, подверженный ошибкам, и вы можете локализовать его для разных культур. Эта работа уже сделана для вас!

Вы также получаете нулевую часть своего вопроса бесплатно! Обратите внимание:

> (38209).toLocaleString()
'38,209'
> (38209.0000).toLocaleString()
'38,209'

Опять же, все бесплатно!

  • 0
    Это интересный подход к проблеме, и я буду исследовать, как включить его в наше приложение. Цени этот совет Рэй! Спасибо.
  • 1
    Я собирался добавить его в свой ответ, но я думаю, что вы должны рассмотреть ответ, который имеет строку в качестве ввода вместо числа, то есть преобразовать значение из строки в int (value | 0).toLocaleString()
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню