Javascript - отдельный номер через запятую

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

У меня есть следующий код:

const nf = new Intl.NumberFormat("es-MX");
let anualidad = 1200;
this.model.enero = nf.format(anualidad);

output: 1200

Моя проблема в том, что он не ставит запятую в 1,200. Я не говорю, что это не работает, потому что, если я поставлю еще один ноль, я добавлю запятую таким образом 12,000

Я уже установил язык на MX

Как я могу сделать это наилучшим образом? так как слишком много вычислений, которые должны быть сделаны таким образом.

1
задан 29.11.2019, 23:42
2 ответа

SegГєn она documentaciГіn этикеток IETF cГіdigo для AmГ©rica Latina и Caribe es-419 и он имеет достаточно чувство, так как в Аргентине, Колумбии или MГ©xico она expresiГіn - тот же самый.

Language-Region:

Де-ДЕ (German for Germany)

В-US (English схвати used in the Унитед Статес)

es-419 (Spanish appropriate for the Латинский язык Америка and Caribbean район using the район code)

ты это Можешь консультировать aquГ -

я делал доказательства, но к несчастью эта этикетка не estГЎ функционируя. Что если это который, если ты ничего не перемещаешь этого строителя, возьми формат, который ты ищешь.

const anualidad = 1200;

const nf  = new Intl.NumberFormat().format( anualidad );
const nf2 = new Intl.NumberFormat('es-419').format( anualidad );
const nf3 = new Intl.NumberFormat('es-MX').format( anualidad );


console.log( nf, nf2, nf3 );

Надеялся, что ты можешь вести

EDIT

Делая доказательства utilicГ© земснаряд Объекта Intl.NumberFormat(), и encontrГ©, у которого Intl.NumberFormat().resolvedOptions() Есть объект этого типа

{
locale: "en-US"
maximumFractionDigits: 3
minimumFractionDigits: 0
minimumIntegerDigits: 1
notation: "standard"
numberingSystem: "latn"
signDisplay: "auto"
style: "decimal"
useGrouping: true
}

, Это может меняться завися браузер, что estГ© используя. Я произошел со строителем tag en-MX, из-за которых в каких-то случаях оно функционирует (Я это увидел в других проектах) или VoilГЎ! funcionГі.

0
ответ дан 01.12.2019, 10:34
  • 1
    Проверь твой ответ, делать следующее: console.log(new Intl.NumberFormat('es-MX').format(12000)); producirá: 12,000 в то время как делать это другим: console.log(new Intl.NumberFormat('es-VE').format(12000)); producirá: 12.000. Следовательно, если, что существует es-MX. Помни, что не все paí ses Amé богатая Латинская и Карибское море они используют Международную Систему, как Mé xico, например. Привет – Mauricio Contreras 30.11.2019, 00:18
  • 2
    Что редкий, из-за которого в snippet, который я сделал, оно не функционирует, но сделал полное решение в консоли Chrome и funcionó. – Alberto Siurob 30.11.2019, 00:21
  • 3
    Тема вопроса, дело в том, что оно функционирует для nú морские окуни 5 dí gitos или má s, но не для nú морские окуни 4 dí gitos. Это идет с любой из этикеток console.log(new Intl.NumberFormat('es-419').format(10000)); //10,000, но это не console.log(new Intl.NumberFormat('es-419').format(9999)); // 9999 (он не добавляет запятую) – porloscerros Ψ 30.11.2019, 00:28

Я сделал одну investigaciГіn достаточно изнурительная из темы, и basarГ© мой ответ на результате, полученном в той же самой.

Во-первых, хотя уже была обсуждена возможность использовать другую систему locale (например en-US), это не отвечает полностью вопрос.

Ясно ты хочешь реализовать ее conversiГіn с типа Number до типа String, но что тот же самый представил число с локальным форматом для es-MX (espaГ±ol MГ©xico).

, Если мы используем mГ©todo toLocaleString(), или mГ©todo NumberFormat из объекта Intl, мы получаем как оказанный следующее:

const number = 1200;
const number2 = 12000;
console.log(number.toLocaleString('es-MX')); // 1200
console.log(new Intl.NumberFormat('es-MX').format(number)); // 1200
console.log(number2.toLocaleString('es-MX')); // 12,000
console.log(new Intl.NumberFormat('es-MX').format(number2)); // 12,000

Ясно не размещает десятичную запятую, если количество dГ-gitos для группы тысяч меньше, чем 2.

SOLUCIГ “N

Способ решать эту проблему (я говорю проблему, хотя это не один bug из языка, а одна decisiГіn estandarizaciГіn) состоит в том, чтобы реализовывать вручную ее conversiГіn nГєmero, так как estГЎndar не мы estГЎ внося желанный результат.

В твоем вопросе ты показываешь, что ты увидел большие формы, но ни одна не убеждает тебя. Правда - что для вкуса, цветов .

Это мое предложение, но я понимаю, что он может делаться из больших других форм.

Давайте Считать нашей собственная funciГіn формата, поддержанный в ней mГЎquina Регулярного Выражения из механизма языка сценариев JavaScript.

Мы Используем следующую expresiГіn регулярная, чтобы форматировать в наш nГєmero в локальном желанном языке:

const miRegEx = /(?=(\d{3})+(?!\d))/g;

В этой expresiГіn регулировать становится одним positive lookahead (?=), ища один или несколько (+) групп 3 dГ-gitos ((\d{3})+), если они есть, он возвращает match вместе со стоимостью, группируемой в 3. Потом, осуществляется один negative lookahead ((?!)), чтобы отвергать любой dГ-gito, что он не группируется первой группой задержания (в этом случае 1 или 2 dГ-gitos). Ты можешь читать mГЎs о lookahead в Рехекс Лоокаеад .

Мы Используем mГ©todo replace из объекта String , который соглашается одну expresiГіn регулировать (которая уже мы имеем) и один parГЎmetro типа String со следующим форматом:

$n Гі $nn, Где n или nn - dГ-gitos меньшие десятичные позитивы в 100, вводит соединенную парами субцепь команды n parГ©ntesis, предоставляемый первым аргументом объекта RegExp.

AsГ, - наш parГЎmetro serГЎ следующий:

$1,

, Где $1 представляет первый аргумент: наша expresiГіn регулировать, и , он sГ-mbolo separaciГіn тысяч, которые мы используем для этого случая.

Из-за Гєltimo, мы должны брать ее decisiГіn из, если мы используем всегда этот mГ©todo, чтобы заменять mГ©todo toLocaleString() или можем сочетать оба.

Давайте Предполагать, что мы будем использовать всегда этот mГ©todo для любой стоимости numГ©rico vГЎlido:

const numero = 123.456789;
const numero2 = 1234.56789;
const numero3 = 123456.789;
const numero4 = 1234567.89;

const formatoMexico = (number) => {
  const exp = /(\d)(?=(\d{3})+(?!\d))/g;
  const rep = '$1,';
  return number.toString().replace(exp,rep);
}

console.log(formatoMexico(numero));  // 123.456,789  <= NO VALIDO
console.log(formatoMexico(numero2)); // 1,234.56,789 <= NO VALIDO
console.log(formatoMexico(numero3)); // 123,456.789
console.log(formatoMexico(numero4)); // 1,234,567.89

Ясно у нас есть серьезная проблема, так как он последовал не vГЎlidos.

Проблема estГЎ, в котором замена осуществляется, не принимая во внимание, что десятичные положения не deberГ-an быть частью замены.

, Чтобы решать эту проблему, у нас есть какие-то выборы, и как я сказал ранее: для вкуса, цветов . Такой

Как один nГєmero в Javascript sГіlo может содержать один carГЎcter . или ни один, мы это используем, чтобы применяться наша funciГіn sГіlo на целой части nГєmero.

мы Будем отделять целую часть десятичной части, применим формат к целой части и потом мы приложим снова все в одном String.

const numero = 123;
const numero2 = 1234;
const numero3 = 123.456789;
const numero4 = 1234.56789;
const numero5 = 123456.789;
const numero6 = 1234567.89;

const formatoMexico = (number) => {
  const exp = /(\d)(?=(\d{3})+(?!\d))/g;
  const rep = '$1,';
  let arr = number.toString().split('.');
  arr[0] = arr[0].replace(exp,rep);
  return arr[1] ? arr.join('.'): arr[0];
}

console.log(formatoMexico(numero));  // 123
console.log(formatoMexico(numero2)); // 1,234
console.log(formatoMexico(numero3)); // 123.456789
console.log(formatoMexico(numero4)); // 1,234.56789
console.log(formatoMexico(numero5)); // 123,456.789
console.log(formatoMexico(numero6)); // 1,234,567.89

С этим у нас есть одна funciГіn, которому он помогает нам превращать nГєmeros в Ваш representaciГіn цепи в локальный формат MГ©xico (десятичная точка и запятые для separaciГіn тысяч).

Применяя это к твоему cГіdigo, podrГ-эксперту иметь:

const formatoMexico = (number) => {
  const exp = /(\d)(?=(\d{3})+(?!\d))/g;
  const rep = '$1,';
  let arr = number.toString().split('.');
  arr[0] = arr[0].replace(exp,rep);
  return arr[1] ? arr.join('.'): arr[0];
}

let anualidad = 1200;
this.model.enero = formatoMexico(anualidad);

// output: 1,200

Изменяя немного этот mГ©todo мы можем делать это для любой системы representaciГіn numГ©rica, который мы желали.

ВїPorquГ© toLocaleString() или FormatNumber() не размещают sГ-mbolo тысяч для чисел между 1000 и 9999?

- один decisiГіn взятие (не sГ© мотив) из-за нее organizaciГіn estandarizaciГіn Unicode . В особенности из-за проекта CLDR (инициалы C ommon L ocale D связывает R repository ).

В estГЎndar обосновывается между другими вещами, главный файл формат numГ©rico . И внутри этого patrГіn, существуют свойство или так называемый признак minimumGroupingDigits, который устанавливать количество dГ-gitos mГ-nimos группы, чтобы использовать разделитель тысяч.

Факт состоит в том, что эта стоимость равна 2 (как он может, повернул в CLDR Сурвеи Тооль ) во всех форматах numГ©ricos принадлежащие ей especificaciГіn es (которые он включает в MГ©xico).

Ввиду этого, их mГ©todos раньше упомянутые, всегда devolverГЎn целые числа 4 чисел без разделителя тысяч.

Надеялся, что это осветляет твое сомнение и помогает тебе решать проблему.

2
ответ дан 01.12.2019, 10:34

Теги

Похожие вопросы