Angular2 {pipes} - Как отформатировать номер телефона?
Я искал здесь и там, и я не могу найти что-то конкретное относительно форматирования номера телефона.
В настоящее время я получаю телефонные номера из JSON в следующем формате:
25565115
Однако я хочу достичь этого результата:
02-55-65-115
Для этого я считаю, что мне нужно использовать настраиваемый канал, и я не думаю, что есть встроенный, который делает это автоматически.
Не могли бы вы дать мне несколько советов о том, как это сделать?
Ответы
Ответ 1
PLUNKER
pipe
реализация в TS будет выглядеть следующим образом
import {Pipe} from 'angular2/core';
@Pipe({
name: 'phone'
})
export class PhonePipe{
transform(val, args) {
val = val.charAt(0) != 0 ? '0' + val : '' + val;
let newStr = '';
for(i=0; i < (Math.floor(val.length/2) - 1); i++){
newStr = newStr+ val.substr(i*2, 2) + '-';
}
return newStr+ val.substr(i*2);
}
}
Использование:
import {Component} from 'angular2/core';
@Component({
selector: 'demo-app',
template: '<p>{{myNumber | phone }}</p>',
pipes: [PhonePipe]
})
export class App {
constructor() {
this.myNumber= '25565115';
}
}
Есть много вещей, которые можно улучшить, я просто сделал это для этого конкретного случая.
Ответ 2
Основываясь на "user5975786", здесь тот же код для Angular2
import { Injectable, Pipe } from '@angular/core';
@Pipe({
name: 'phone'
})
export class PhonePipe
{
transform(tel, args)
{
var value = tel.toString().trim().replace(/^\+/, '');
if (value.match(/[^0-9]/)) {
return tel;
}
var country, city, number;
switch (value.length) {
case 10: // +1PPP####### -> C (PPP) ###-####
country = 1;
city = value.slice(0, 3);
number = value.slice(3);
break;
case 11: // +CPPP####### -> CCC (PP) ###-####
country = value[0];
city = value.slice(1, 4);
number = value.slice(4);
break;
case 12: // +CCCPP####### -> CCC (PP) ###-####
country = value.slice(0, 3);
city = value.slice(3, 5);
number = value.slice(5);
break;
default:
return tel;
}
if (country == 1) {
country = "";
}
number = number.slice(0, 3) + '-' + number.slice(3);
return (country + " (" + city + ") " + number).trim();
}
}
Ответ 3
При форматировании телефонных номеров из службы данных JSON это было самым простым решением, о котором я мог подумать.
<p>0{{contact.phone.home | slice:0:1}}-{{contact.phone.home | slice:1:3}}-{{contact.phone.home | slice:3:5}}-{{contact.phone.home | slice:5:8}}</p>
Это приведет к форматированию "25565115" в "02-55-65-115"
Надеюсь, это поможет кому-то!
Ответ 4
Вы можете использовать что-то подобное в пользовательском конвейере Angular2:
switch (value.length) {
case 10:
country = 1;
city = value.slice(0, 3);
number = value.slice(3);
break;
case 11:
country = value[0];
city = value.slice(1, 4);
number = value.slice(4);
break;
case 12:
country = value.slice(0, 3);
city = value.slice(3, 5);
number = value.slice(5);
break;
default:
return tel;
}
Для получения дополнительной информации просмотрите этот файл AngularJS, но, как я уже сказал, вам нужно преобразовать его в Angular2:
http://jsfiddle.net/jorgecas99/S7aSj/
Ответ 5
Я только что натолкнулся на эту статью, показывающую, как это сделать, используя библиотеку Google с именем libphonenumber. Кажется, они используют эту библиотеку во многих разных языках и имеют очень широкую поддержку (ссылка только на версию пакета JS). Вот как я реализовал это для португальских/бразильских телефонных номеров:
Первый:
npm i libphonenumber-js
Затем:
# if you're using Ionic
ionic generate pipe Phone
# if you're just using Angular
ng generate pipe Phone
В заключение:
import { Pipe, PipeTransform } from '@angular/core';
import { parsePhoneNumber } from 'libphonenumber-js';
@Pipe({
name: 'phone'
})
export class PhonePipe implements PipeTransform {
transform(phoneValue: number | string): string {
const stringPhone = phoneValue + '';
const phoneNumber = parsePhoneNumber(stringPhone, 'BR');
const formatted = phoneNumber.formatNational();
return formatted;
}
}
Вы можете реализовать много разных способов с этой библиотекой. Там много, много удобных методов, вы можете просто прочитать и посмотреть, как вам это подходит.
Недурно, если вам понравилось. знак равно