Ionic 3 angular ввод валюты

У меня есть Приложение 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>

В коде ошибок нет. Но это не работает или автоматически не ставит десятичный знак между сотнями или тысячами.

Может ли кто-нибудь пролить свет на меня? Заранее спасибо.

Вы изучали возможность использования CurrencyPipe? angular.io/api/common/CurrencyPipe

jmdavalos 30.10.2018 04:12
Поведение ключевого слова "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) для оценки ваших знаний,...
0
1
1 515
2

Ответы 2

Я нашел пакет, который решил мою проблему. Я использовал 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;
  }
}
  • Передайте требуемую точность и начальную сумму.
  • Прослушайте выходное событие, чтобы захватить необработанные данные для расчета.

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