Я видел слишком много примеров, но ни один из них не убедил меня в том, чего я действительно хочу, и в лучшей практике сделать это.
У меня есть следующий код:
const nf = new Intl.NumberFormat("es-MX");
let anualidad = 1200;
this.model.enero = nf.format(anualidad);
output: 1200
Моя проблема в том, что он не ставит запятую в 1,200
. Я не говорю, что это не работает, потому что, если я поставлю еще один ноль, я добавлю запятую таким образом 12,000
Я уже установил язык на MX
Как я могу сделать это наилучшим образом? так как слишком много вычислений, которые должны быть сделаны таким образом.
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Гі.
Я сделал одну 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 чисел без разделителя тысяч.
Надеялся, что это осветляет твое сомнение и помогает тебе решать проблему.
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:18console.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