Как я могу отформатировать поля ввода как валюту в Angular

Я работаю над проектом Angular, и у меня есть объект типа Project, который содержит следующие значения:

стоимость: 56896 и стоимостьHR: 27829

Я хочу изменить объект с помощью формы и привязать поля с помощью ngModel к атрибутам.

Но проблема, с которой я столкнулся, заключается в том, что в поле я хочу отобразить число в формате валюты (например, 56 896 €), которое несовместимо с типом переменной, который является плавающим.

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

Любая помощь будет принята с благодарностью.

import { Component, OnInit } from '@angular/core';
import { CurrencyPipe } from '@angular/common';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css'],
  providers: [CurrencyPipe]
})
export class AppComponent implements OnInit {

  project = {
    cost: 56896,
    costRH: 27829
  }

  constructor(private currencyPipe: CurrencyPipe) { }

  ngOnInit() {
    this.project.cost = this.currencyPipe.transform(this.project.cost, 'EUR', 'symbol', '1.0-0');
    this.project.costRH = this.currencyPipe.transform(this.project.costRH, 'EUR', 'symbol', '1.0-0');
  }

  onBlur(event, projectProperty) {
    this.project[projectProperty] = this.currencyPipe.parse(event.target.value);
  }

}
<form>
  <label for = "cost">Cost</label>
  <input [(ngModel)] = "project.cost" (blur) = "onBlur($event, 'cost')" [ngModelOptions] = "{updateOn: 'blur'}" [value] = "project.cost | currency:'EUR':'symbol':'1.0-0'">

  <label for = "costRH">Cost RH</label>
  <input [(ngModel)] = "project.costRH" (blur) = "onBlur($event, 'costRH')" [ngModelOptions] = "{updateOn: 'blur'}" [value] = "project.costRH | currency:'EUR':'symbol':'1.0-0'">
</form>

Что я ожидал: Я ожидал, что поля ввода будут отформатированы как валюта (например, 56 896 €), а соответствующие свойства в объекте «projet» (cost и costRH) будут обновляться проанализированным значением, когда ввод теряет фокус.

Что произошло вместо: Значение, отображаемое в полях ввода, не отформатировано как валюта, и соответствующие свойства в объекте не обновляются должным образом.

Отвечает ли это на ваш вопрос? html5 ввод денег/валюты

Pouria Ansari 26.01.2023 07:51

Я бы создал отдельный <span class = "currency">{{ валюта }}</span> рядом с полем ввода чисел и наложил бы их на CSS. (поместите диапазон вместо ввода числа) Убедитесь, что с отступами число не заблокировано новым диапазоном. (Кроме того, вам, вероятно, следует попробовать использовать какую-нибудь библиотеку локализации)

Geri Dremák 26.01.2023 07:56
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
2
99
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я использовал Numberal js для форматирования чисел, и это было потрясающе

Ваш желаемый формат - это '0,0[.]00 €'

проверить документы

Ответ принят как подходящий

вы можете использовать такую ​​директиву, как

@Directive({
  selector: '[format]',
})
export class FormatDirective implements OnInit {
  format = 'N0';
  digitsInfo = '1.0-0';
  @Input() currency = '$';
  @Input() sufix = '';
  @Input() decimalCharacter = null;
  @Input('format') set _(value: string) {
    this.format = value;
    if (this.format == 'N2') this.digitsInfo = '1.2-2';

    const parts = value.split(':');
    if (parts.length > 1) {
      this.format = value[0];
      this.digitsInfo = parts[1];
    }
  }
  @HostListener('blur', ['$event.target']) blur(target: any) {
    target.value = this.parse(target.value);
  }
  @HostListener('focus', ['$event.target']) focus(target: any) {
    target.value = this.control.value;
  }
  ngOnInit() {
    setTimeout(() => {
      this.el.nativeElement.value = this.parse(this.el.nativeElement.value);
    });
  }
  constructor(
    @Inject(LOCALE_ID) private locale: string,
    private el: ElementRef,
    private control: NgControl
  ) {}
  parse(value: any) {
    let newValue = value;

    if (this.format == 'C2')
      newValue = formatCurrency(value, this.locale, this.currency);
    if (this.format == 'N2')
      newValue = formatNumber(value, this.locale, this.digitsInfo);
    if (this.format == 'N0')
      newValue = formatNumber(value, this.locale, this.digitsInfo);
    if (this.format == 'NX')
      newValue = formatNumber(value, this.locale, this.digitsInfo);
    if (this.decimalCharacter)
      return (
        newValue.replace('.', 'x').replace(',', '.').replace('x', ',') +
        this.sufix
      );

    return newValue + this.sufix;
  }

}

Работает как

<input format = "N0" [(ngModel)] = "value"/>
<input format = "N2" [(ngModel)] = "value"/>
<input format = "C2" [(ngModel)] = "value"/>
<input format = "N2" decimalCharacter='.' sufix=' €' [(ngModel)] = "value"/>

Идея директивы заключается в том, что при размытии меняется «родной элемент», но не значение ngControl, когда фокус возвращает значение ngControl

стекблиц

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