ぼかしイベントで通貨パイプを使用しています。しかし、検証のエラーメッセージが表示されたときに初めて正常に機能します。いくつかの数値を削除して表示された場合、通貨フォーマットにフォーマットされず、ユーザーが削除したフォーマットのままになります。たとえば、次の番号を指定しました:36543265
入力から出たとき、検証エラーメッセージとともに$36,543,265.00
にフォーマットされます。そのため、265.00
から$36,543,265.00
を削除しても、エラー検証メッセージが引き続き表示されます。そのため、検証エラーメッセージが表示され、この形式$36,543
のままでしたが、適切な形式になりませんでした。検証メッセージを消去した後、USD
の適切な通貨パイプ形式にする方法を教えてください。
ユーザーによる値の削除に基づいて適切にフォーマットされるようにするにはどうすればよいですか?.
TS:
public transformAmount(element, name) {
if (name == "amount") {
let formattedAmount = this.currencyPipe.transform(this.eoInfoForm.value.amount, 'USD');
element.target.value = formattedAmount;
this.eoInfoForm.get('amount').setValue(formattedAmount);
if (this.eoInfoForm.get('amount').status === 'VALID') {
this.amt = false;
}
else {
this.amt = true;
}
}
}
HTML:
<input type="text" class="form-control" placeholder="Amount in dolars"
formControlName="amount" autocomplete="off" maxlength="8" allowNumberOnly (blur)="transformAmount($event,'amount')" [ngClass]="{ 'is-invalid': amt && eoInfo.amount.invalid }">
<div *ngIf="amt && eoInfo.amount.invalid" class="invalid-feedback">
<div *ngIf="amt && eoInfo.amount.invalid">Maximum of 8 characters including $ is allowed</div>
</div>
デモ: [〜#〜] demo [〜#〜]
それを機能させるために、コードのいくつかを変更しました: Working solution
ここに主要な部分があります:
public transformAmount(name) {
let formattedAmount = this.currencyPipe.transform(
this.eoInfoForm.value.amount.replace(/[^\d.E+]/gm, ""),
"USD"
);
this.eoInfoForm.get(name).setValue(formattedAmount);
}
私がやったことは、パイプに再度渡す前に、値のパイプ変換を反転することです。 /[^\d.E+]/gm
正規表現を使用して、に含まれていないものをすべて削除しました。
「E」と「+」は、数値が非常に大きく、$1.00E+37
のように表示される特定のケースを処理するためのものです。
テキストがフォーマットされている場合は、最大長の8が適用されると想定していたので、触れませんでした(それ以外の場合は、カスタムバリデーターが必要です)。 TypeFormファイルに移動したのは、リアクティブフォームを使用しているため、テンプレートフォームの概念を混在させない方が良いからです。
最初に指摘したいこと:
maxlength="8"
を使用します。通貨パイプを使い始めるまでは問題ありません。通貨パイプによって追加された文字が考慮されます。それが望ましい動作かどうかはわかりませんが、ユーザーの観点からは直感的ではありません。
「最大8文字まで入力できます。最大8文字まで入力できます」-検証メッセージを読むときに最初に考えたいことです。 (その時点で)フォーマットされていない数値を入力している間、自分で通貨のフォーマットを考える必要はありません。
私はmaxLength
14(8 + 1ドル記号+ 2カンマ+ 1ドット+ 2桁はUSD = 14文字の可能な最大数です)を作成し、検証メッセージを値8のままにすることを言います。または、フォーマット後に実際に8文字しか必要ない場合は、検証メッセージの値を3(3 + 1ドル記号+ 1カンマ+ 1ドット+ 2桁= 7)にして、4桁にすると、フォーマット後に9文字になります。コンマが追加され、maxLength 8を超える9文字になります。
ジェネリック*ngIf="amt && eoInfo.amount.invalid"
に依存する代わりに、長さのカスタム検証を使用して、適切に自分自身をチェックすることもできます(これは、通貨形式が異なる場合に適しています)。
ここであなたの実際の問題について、私が素晴らしいと思う解決策は、編集中にフォーマットを削除することです。ユーザーが編集して.
,
と$
をナビゲートする必要があるのは、編集するときに本当に重要なのは数字だけである場合、実際には決して現実的ではありません。ユーザーがフィールドにフォーカスしたときに「逆通貨パイプ」を作成して、表示されるすべてが数値になるようにすることができます。
私はあなたの Stackblitzデモ を手短にフォークしましたが、最大長は小数点の前の桁数を指すと仮定しています。
何か変更が必要かどうか、それが問題の解決に役立つかどうかをお知らせください。