Форматировать номер строки как валюту

Я хотел бы, чтобы функция маски форматировала число (как строку), как это делают многие плагины маски.

Желаемое поведение:

format('1') // '0,01'
format('12') // '0,12'
format('123') // '1,23'
format('12345678') // '123.456,78'

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

[РЕДАКТИРОВАТЬ]

Обыскало много вопросов здесь в stackru, но в основном ответы состоят в добавлении двух десятичных регистров в конце строки. Это не то, что я ожидал.

ОЖИДАЕТСЯ:

format('1') // '0,01'
format('123') // '1,23'

НЕОЖИДАННО:

format('1') // '1,00'
format('123') // '123,00'

1 ответ

Решение

Вот двухэтапное решение: получить цифры, отсортированные по 3+ цифрам и 1-2 цифрам с

^(?:(\d+)(\d{2})|(\d{1,2}))$

Посмотреть демо-версию регулярного выражения

Таким образом, числа больше 1 будут иметь целые части в группе 1 и десятичные части в группе 2, а в группе 3 все дробные числа будут меньше 0.

Затем мы проверяем число, которое мы получаем, и добавляем только тысячи разделителей к целочисленным частям с

.replace(/(\d)(?=(\d{3})+(?!\d))/g, "$1.")

Смотрите демоверсию JS:

function format(s) {
  var re = /^(?:(\d+)(\d{2})|(\d{1,2}))$/; 
  if ((m = s.match(re)) !== null) {   
      if (m[3]) {                     // We have 1 or 2 digit number
          return m[3].length == 1 ? 
              "0,0" + m[3] : "0," + m[3];
      } else {                       // We have a longer number
          return m[1].replace(/(\d)(?=(\d{3})+(?!\d))/g, "$1.") + "," + m[2];
      }
    
    }
}

document.body.innerHTML = format('1') + "<br/>"; // '0,01'
document.body.innerHTML += format('12') + "<br/>"; // '0,12'
document.body.innerHTML += format('123') + "<br/>"; // '1,23'
document.body.innerHTML += format('12345678') + "<br/>"; // '123.456,78'

На самом деле, вы можете добавить разделители тысяч и десятичных знаков в качестве аргументов функции:

function format(str, thd, dec) {
  var re = /^(?:(\d+)(\d{2})|(\d{1,2}))$/; 
  if ((m = str.match(re)) !== null) {   
    if (m[3]) {                     // We have 1 or 2 digit number
      return m[3].length == 1 ? 
         "0" + dec + "0" + m[3] : "0" + dec + m[3];
    } else {                       // We have a longer number
         return m[1].replace(/(\d)(?=(\d{3})+(?!\d))/g, "$1" + thd) + dec + m[2];
    }
  }
}

var thd = "."; // Thousand separator
var dec = ","; // Decimal separator
document.body.innerHTML = format('1', thd, dec) + "<br/>"; // '0,01'
document.body.innerHTML += format('12', thd, dec) + "<br/>"; // '0,12'
document.body.innerHTML += format('123', thd, dec) + "<br/>"; // '1,23'
document.body.innerHTML += format('12345678', thd, dec) + "<br/>"; // '123.456,78'

Другие вопросы по тегам