У меня есть Приложение Ionic 3, где я хочу отформатировать все поле ввода валюты формальным образом. Если я ввожу 10 000, в поле должно отображаться следующее: 10 000,00 филиппинских песо, а при сотнях - так: 100,00 филиппинских песо.
Я также хочу обрабатывать кнопку возврата или очистки в Ионный при вводе поля, чтобы я мог справиться с этим в Android или iOS, на который я не мог найти какие-либо решения или ответ в Google.
Я уже нашел ссылка в стиле jQuery с jsfiddle на нем.
Но когда я перевел код на Угловой / Ионный, это не решило мою проблему.
Вот мой код в моем ts файл
handleCurrency(e) {
console.info(e)
if (e.keyCode == 8 && this.form.value.amount.length > 0) {
this.form.value.amount = this.form.value.amount.slice(0, this.form.value.amount.length - 1); //remove last digit
this.form.value.amount = this.formatNumber(this.form.value.amount);
}
else {
let key = this.getKeyValue(e.keyCode);
if (key) {
this.form.value.amount += key; //add actual digit to the input string
this.form.value.amount = this.formatNumber(this.form.value.amount); //format input string and set the input box value to it
}
}
// return false;
}
getKeyValue(keyCode) {
if (keyCode > 57) { //also check for numpad keys
keyCode -= 48;
}
if (keyCode >= 48 && keyCode <= 57) {
return String.fromCharCode(keyCode);
}
}
formatNumber(input) {
if (isNaN(parseFloat(input))) {
return "0.00"; //if the input is invalid just set the value to 0.00
}
let num = parseFloat(input);
return (num / 100).toFixed(2); //move the decimal up to places return a X.00 format
}
а в моем html
<ion-input type = "number" formControlName = "amount" min = "0.01" step = "0.01" value = "0.00" (keypress) = "handleCurrency($event)" placeholder = ""></ion-input>
В коде ошибок нет. Но это не работает или автоматически не ставит десятичный знак между сотнями или тысячами.
Может ли кто-нибудь пролить свет на меня? Заранее спасибо.



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


Я нашел пакет, который решил мою проблему. Я использовал ng2-валюта-маска, чтобы установить желаемый формат валюты. Но все еще была проблема с кнопкой возврата или очистки на Android и iOS о том, как с этим справиться. По умолчанию всегда возвращает 229 keyCode
I might be too late for OP, but hoping my solution will help future visitors. I have also written a blog on medium to further detail the solution. Full source code can be found on github
Используя привязку данных angular, конвейер валюты и собственный ионный ввод, можно легко реализовать настраиваемое поле ввода валюты.
First, we will create a reusable input component:
number-input.component.html
<ion-item (click) = "openInput()">
{{ formattedAmount }}
<ion-input name = "dummyFacade" id = "dummyFacade" #dummyFacade type = "number" inputmode = "numeric"
(keyup) = "handleKeyUp($event)" (ionInput) = "handleInput($event)"></ion-input>
</ion-item>
number-input.component.js
@Component({
selector: 'app-number-input',
templateUrl: './number-input.component.html',
styleUrls: ['./number-input.component.scss'],
providers: [CurrencyPipe]
})
export class NumberInputComponent implements OnInit {
private static BACKSPACE_KEY = 'Backspace';
private static BACKSPACE_INPUT_TYPE = 'deleteContentBackward';
@ViewChild('dummyFacade', {static: false}) private dummyFacade: IonInput;
@Input() precision: number;
@Input() amount: string;
@Output() amountEntered = new EventEmitter<number>();
constructor(private currencyPipe: CurrencyPipe) { }
ngOnInit() {
if (this.amount && this.amount.trim() !== '') {
this.amountEntered.emit(+this.amount);
}
}
handleKeyUp(event: KeyboardEvent) {
// this handles keyboard input for backspace
if (event.key === NumberInputComponent.BACKSPACE_KEY) {
this.delDigit();
}
}
handleInput(event: CustomEvent) {
this.clearInput();
// check if digit
if (event.detail.data && !isNaN(event.detail.data)) {
this.addDigit(event.detail.data);
} else if (event.detail.inputType === NumberInputComponent.BACKSPACE_INPUT_TYPE) {
// this handles numpad input for delete/backspace
this.delDigit();
}
}
private addDigit(key: string) {
this.amount = this.amount + key;
this.amountEntered.emit(+this.amount);
}
private delDigit() {
this.amount = this.amount.substring(0, this.amount.length - 1);
this.amountEntered.emit(+this.amount);
}
private clearInput() {
this.dummyFacade.value = CONSTANTS.EMPTY; // ensures work for mobile devices
// ensures work for browser
this.dummyFacade.getInputElement().then((native: HTMLInputElement) => {
native.value = CONSTANTS.EMPTY;
});
}
get formattedAmount(): string {
return this.currencyPipe.transform(+this.amount / Math.pow(10, this.precision));
}
openInput() {
this.dummyFacade.setFocus();
}
}
ion-item инкапсулирует строковое поле formattedAmount для отображения значений в денежном формате и ion-input для захвата вводимых пользователем данных.ionInput и keyup из ion-input, мы сначала выводим поле formattedAmount с помощью currency pipe и одновременно очищаем поле ввода соответственно при каждом нажатии клавиши пользователя. Конечно, игнорирование любого нечислового ввода с клавиатуры. Это создает иллюзию красиво отформатированного поля ввода валюты.ion-input при щелчке ионного элемента.EventEmitter для вывода необработанного пользовательского ввода на вызывающую родительскую страницу.
Then, we will use it across any page where user input for amount in currency format is required:
app.page.html
<ion-content>
<app-number-input [precision] = "precision" [amount] = "''" (amountEntered) = "amountChanged($event)"></app-number-input>
</ion-content>
app.page.ts
@Component({
selector: 'app-home',
templateUrl: 'home.page.html',
styleUrls: ['home.page.scss'],
})
export class HomePage {
amount = 0;
precision = 2;
entry;
constructor() {}
amountChanged(event: number) {
this.amount = event;
}
}
Вы изучали возможность использования
CurrencyPipe? angular.io/api/common/CurrencyPipe