Para poder afirmar que estás construyendo tu propio Pipe, es necesario hacer uso del CLI de Angular con el comando ng generate pipe test-name o en su forma corta con ng g p test-name.
Mi primer "pipe" en Angular
De la misma manera que lo hace con los servicios y componentes, el CLI creará un archivo .ts que contiene el código del pipe y un archivo .spec.ts para sus respectivas pruebas unitarias.
El pipe ya trae algo de código y configuraciones por defecto. Tendrás que cambiar los unknown por el tipeado que necesites dependiendo el pipe que estés generando.
Es importante observar el decorador @Pipe() que contiene el nombre del pipe, para así poder llamarlo en tu HTML.
Y no olvides importar el pipe en el módulo de tu aplicación para que este pueda ser utilizado.
Vamos a crear tu propio currency pipe. Para esto harás uso del objeto global de Javascript Intl. Si no conocías este objeto, puedes leer más al respecto de su Especificación de ECMAScript.
El global Jacascript Intl, proporciona una API de internacionalización para el formateo de monedas y fechas, entre otras funcionalidades más.
Veamos un ejemplo de cómo utilizarlo:
// pipes/custom-currency.pipe.tsimport{Pipe,PipeTransform}from'@angular/core';@Pipe({name:'customCurrency'})exportclassCustomCurrencyPipeimplementsPipeTransform{transform(value: number,...args: string[]): string {const divisa = args[0];if(divisa =='USD')returnnewIntl.NumberFormat('en-us',{style:'currency',currency:'USD'}).format(value);elsereturnnewIntl.NumberFormat('es-ar',{style:'currency',currency:'ARS'}).format(value);}}
El pipe recibe un parámetro del tipo numbery usando el segundo parámetro args puedes capturar las variables que necesites pasarle. En este ejemplo, lo empleamos para configurar el tipo de divisa.
Verificamos qué divisa se está pasando por parámetro. Si es USD, empleando el objeto Intl damos formato a la moneda para que sea $1,000.00 mientras que con cualquier otra divisa sea $1.000,00. Nota la pequeña diferencias de intercambiar el punto y la coma para formatear el número y los decimales.
Finalmente, utiliza tu nuevo pipe en el HTML de la siguiente manera:
<div>{{1000| customCurrency:'USD'}}</div>
Los pipes utilizan un concepto llamado Memoization para ahora en tiempo de ejecución guardando el resultado de las funciones en memoria.
Emplea tus propios pipes siempre que sea posible para optimizar tu aplicación.
Saludos! Tenia en mente una solución similar, sin embargo no sabia por que solo me remplazaba un carácter y con la siguiente referencia entendí el porqué de los "slash" en donde podemos aplicar las funcionalidades.
'Greetings Esto es un saludo'.replace('e','3');//Gr3etings Esto es un saludo;/*
la "g" indica que es de forma global
*/'Greetings Esto es un saludo'.replace(/e/g,'3');//Gr33tings Esto 3s un saludo;/*
la "i" indica que sea indiferente ante las mayúsculas
y minúsculas
*/'Greetings Esto es un saludo'.replace(/e/gi,'3');//Gr33tings 3sto 3s un saludo;/*
la "|" representa la condicional "or"
*/'Greetings Esto es un saludo'.replace(/e|E/g,'3');//Gr33tings 3sto 3s un saludo;```
Mi solución al reto usando expresiones regulares:
import{Pipe,PipeTransform}from"@angular/core";@Pipe({ name:"changeVowels",})exportclassChangeVowelsPipeimplementsPipeTransform{transform(value:string):string{return value
.replace(/(a)/g,"1").replace(/(e)/g,"2").replace(/(i)/g,"3").replace(/(o)/g,"4").replace(/(u)/g,"5");}}
Espero que se entienda, al igual que el profe separe separe el string a un array, lo mapeé y si una palabra se encuentra en el diccionario(vowels) retorna el valor del diccionario, sino, me retorna la misma letra; y por ultimo uní el array.
Se me ocurrió esta solución. De esta manera, se hace un replace por cada una de las letras que se deseen:
.
.
P. D. Separé la función reductora para que se vea más ordenado.
Acabo de ver que surge un error aparentemente por el tema de this por como se llama la función dentro del reduce, así que decidí dejarlo cambiarlo a una arrow function dentro del reduce. Así queda la clase:
.
apunte a usar los aprendido en el curso de arrays
exportclassA1PipeimplementsPipeTransform{transform(value: string): string {return value
.split('a').join('0').split('e').join('2').split('i').join('3').split('o').join('4').split('u').join('5')}}
Una pregunta, ¿Tiene alguna regla esto de los pipe para implementar? Me refiero a que si puede alentar la app si al final llegamos a tener varios pipes personalizados
No creo que pueda poner lenta nuestra aplicación, siempre y cuando usemos los pipes para lo que son es decir el de dar formato o transformar los datos antes de ser mostrados en nuestra aplicación porque si le pasamos cálculos complejos o llamadas a APIs en los pipes esto si nos puede dar problemas de rendimiento
Mi forma de resolver el reto...transform(value: string): string {let newChain = value;let i =0;while(i < value.length){if(value[i]==='a'){ newChain = value.replaceAll('a','4');}elseif(value[i]==='e'){ value = newChain.replaceAll('e','3');}elseif(value[i]==='i'){ newChain = value.replaceAll('i','1');}elseif(value[i]==='o'){ value = newChain.replaceAll('o','0');}elseif(value[i]==='u'){ newChain = value.replaceAll('u','9');} i++;}return newChain;}