Я работаю над проектом 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) будут обновляться проанализированным значением, когда ввод теряет фокус.
Что произошло вместо: Значение, отображаемое в полях ввода, не отформатировано как валюта, и соответствующие свойства в объекте не обновляются должным образом.
Я бы создал отдельный <span class = "currency">{{ валюта }}</span> рядом с полем ввода чисел и наложил бы их на CSS. (поместите диапазон вместо ввода числа) Убедитесь, что с отступами число не заблокировано новым диапазоном. (Кроме того, вам, вероятно, следует попробовать использовать какую-нибудь библиотеку локализации)



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Я использовал 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
Отвечает ли это на ваш вопрос? html5 ввод денег/валюты