2010-01-18 51 views
18

Tôi có các bản ghi cơ sở dữ liệu dưới dạng các chuỗi dài 10 ký tự, chẳng hạn như 4085551234.Làm cách nào để định dạng chuỗi gồm 10 chữ số thành số điện thoại?

Tôi muốn định dạng chúng thành định dạng sau: (408) 555-1234.

Tôi nghĩ rằng đây là liên quan đến regex. Tôi mới lập trình và hoàn toàn tự học ở đây, vì vậy bất kỳ loại tài nguyên nào liên quan đến việc thực hiện xử lý văn bản cũng sẽ được đánh giá cao. Cảm ơn!

+0

công nghệ db (mysql) là gì? – grenade

+2

Chỉ cần một bên - định dạng số điện thoại khác nhau WIDELY trên toàn cầu, vì vậy, trừ khi bạn chắc chắn bạn chỉ bao giờ hiển thị số kiểu Mỹ hoặc tương tự, bạn có thể không muốn mã hóa một định dạng cụ thể. – Joe

+0

Tương tự: http://stackoverflow.com/a/5872200/386579 –

Trả lời

88

Một regex chắc chắn là quá mức cần thiết cho một này. Nếu bạn muốn có một "số điện thoại" và bình thường hóa nó đến 10 chữ số, đó sẽ là một sử dụng tốt cho một regex. Để làm được những gì bạn đang yêu cầu, chỉ cần làm một cái gì đó như:

echo '('.substr($data, 0, 3).') '.substr($data, 3, 3).'-'.substr($data,6); 

Vì bạn đã biết làm thế nào để phân chia dữ liệu của bạn, bạn chỉ có thể sử dụng substr hoặc một cái gì đó tương tự để lấy những phần bạn muốn. RegEx rất hữu ích cho việc kết hợp các chuỗi không phải lúc nào cũng có định dạng nghiêm ngặt. (Giống như số lượng không gian thay đổi, công cụ biến đổi trước hoặc sau nó, dấu gạch ngang thêm, v.v ...). Nhưng trong trường hợp của bạn đầu vào luôn luôn được định dạng đúng 10 chữ số, không có gì khác, vì vậy bạn không cần thêm chi phí của một RegEx để định dạng nó.

+2

Tôi thích phương pháp đằng sau điều này nhất. Cảm ơn rất nhiều! Tôi có thể thấy cách bạn đã làm những gì bạn đã làm, và tôi đã học được một chút về substr(). Cảm ơn! – dmanexe

+1

Dấu nháy đơn sẽ hoạt động tốt ở đây vì nó không cần phải được xử lý. – Cymbals

18

Hãy xem ở đây: Format phone number

function format_phone($phone) 
{ 
    $phone = preg_replace("/^\d/", "", $phone); 

    if(strlen($phone) == 7) 
     return preg_replace("/(\d{3})(\d{4})/", "$1-$2", $phone); 
    elseif(strlen($phone) == 10) 
     return preg_replace("/(\d{3})(\d{3})(\d{4})/", "($1) $2-$3", $phone); 
    else 
     return $phone; 
} 
3

trivially bạn có thể làm một cái gì đó như:

\(\d\{3\}\)\(\d\{3\}\)\(\d\{4\}\) 

Để phù hợp với 10 chữ số thành 3 biểu thức phân nhóm, và sau đó in chúng ra sử dụng mỗi nhóm:

"(\1) \2-\3 

Nhưng trong thực tế miễn phí dưới dạng dữ liệu thường phức tạp hơn một chút

6

Tôi có thể đi với

$num = "4085551234"; // given             
$formatted = "(".substr($num,0,3).") ".substr($num,3,3)."-".substr($num,6); 

Regex không thực sự phù hợp ở đây.

+0

Cảm ơn! Tương tự như giải pháp đã đề cập ở trên, tôi đã sử dụng. – dmanexe

2

Tôi phải thực hiện câu hỏi này cho lớp khoa học máy tính vị trí nâng cao của mình. Java:

Viết chương trình chấp nhận 10 chữ số và định dạng dưới dạng số điện thoại.

Ex: 705726552
Output: (705)726-2552

import java.util.Scanner; 
    public class TelNumCorrection{ 

    public static void main(String[]args){ 

    Scanner scan = new Scanner(System.in); 
    System.out.println("Please enter a 10 digit number"); 
    String num=scan.nextLine(); 

    String a=num.substring(0,3); 
    String b=num.substring(3,6); 
    String c=num.substring(6); 
    System.out.println("("+a+ ")"+b+"-"+c); 
    } 
} 
+1

nó trả lời câu hỏi, nó cung cấp một chương trình để quét và sau đó định dạng/in số theo yêu cầu trong câu hỏi – amdixon

+2

Câu hỏi này được gắn thẻ với php, vì vậy câu trả lời này dường như không có liên quan. – timss

Các vấn đề liên quan