2008-10-29 8 views
4

Si j'avais un numéro de téléphone comme celui-ciPuis-je formater une chaîne comme un nombre dans .NET?

string phone = "6365555796"; 

Ce que je stocke avec uniquement des caractères numériques dans ma base de données (sous forme de chaîne), est-il possible de sortir le nombre comme ceci:

"636-555-5796" 

similaire à la façon dont je pourrais si j'utilisais un numéro:

long phone = 6365555796; 
string output = phone.ToString("000-000-0000"); 

J'ai essayé la recherche et tout ce que je pourrait fi nd online étaient des documents de formatage numériques. La raison pour laquelle je demande est parce que je pense que ce serait une idée intéressante de ne stocker que les valeurs numériques dans la base de données et permettre une mise en forme différente en utilisant une valeur de chaîne constante pour dicter comment mes numéros de téléphone sont formatés. Ou suis-je mieux d'utiliser un numéro pour cela?

EDIT: La question est de formater une chaîne qui contient des nombres, pas un nombre lui-même.

+0

J'ai supprimé ma réponse originale et j'ai édité la question pour clarifier pourquoi je me trompais. – swilliams

Répondre

7

mieux que je peux penser sans avoir à se convertir à un long/nombre et il convient à une ligne est:

string number = "1234567890"; 
string formattedNumber = string.Format("{0}-{1}-{2}", number.Substring(0,3), number.Substring(3,3), number.Substring(6)); 
1

Pourquoi ne pas simplement faire quelque chose comme ça?

string phoneText = "6365555796"; 
long phoneNum = long.Parse(phoneText); 
string output = phoneNum.ToString("000-000-0000"); 
+0

C'est une idée intéressante, mais si je veux inclure les nombres dans un Gridview ASP.NET ou un Répéteur, il faudrait un code supplémentaire pour sortir les nombres correctement. Je me demandais s'il y avait une fonction .NET en une ligne que je ne pouvais pas voir ... –

+0

Vous avez déjà la réponse de swilliams. Mais vous pouvez également utiliser cette fonctionnalité dans "une ligne" si vous utilisez un délégué anonyme. –

+0

Si le nombre a un 0, alors vous risquez d'obtenir une sortie erronée – faulty

0

Vous pouvez potentiellement insérer une chaîne à un point de caractère donné. Un peu comme: phone = phone.Insert (3, "-"); phone = phone.Insert (7, "-");

+0

Ceci est "lent", car il entraînera beaucoup de créations de chaînes. –

+0

Il devrait être plus rapide que l'analyse d'un long, cependant. – configurator

-1

Pour contrôler le format de chaîne d'un nombre pour l'affichage dans un ASP.NET GridView ou un autre contrôle, vous pouvez envelopper votre article dans une classe d'aide à des fins d'affichage:

public class PhoneDisplay 
{ 
    long phoneNum; 
    public PhoneDisplay(long number) 
    { 
     phoneNum = number; 
    } 
    public override string ToString() 
    { 
     return string.Format("{0:###-###-####}", phoneNum); 
    } 

} 

Ensuite, définir des données ou des champs d'affichage (par exemple):

PhoneDisplay MyPhone = new PhoneDisplay(6365555796); 
4

Je pense que cela fonctionne

string s = string.Format("{0:###-###-####}", ulong.Parse(phone)); 

addtion Dans ce http://blog.stevex.net/index.php/string-formatting-in-csharp/ est un bon article sur la mise en forme des chaînes dans .NET.

Merci à @swilliams pour les clarifications.

+0

Heh, j'avais copié l'URL pour le coller sur mon post, mais j'ai oublié de le faire pour une raison quelconque ... – swilliams

+0

vous êtes en avance sur moi! –

6

Soyez conscient que tout le monde utilise le format nord-américain 3-3-4 pour téléphone Nombres. Les numéros de téléphone européens peuvent comporter jusqu'à 15 chiffres, avec une ponctuation significative, par ex. + 44-XXXX-XXXX-XXXX est différent de 44 + XXXX-XXXX-XXXX. Vous ne tenez pas compte non plus des PBX et des extensions, qui peuvent nécessiter plus de 30 chiffres.

Les téléphones militaires et radio peuvent avoir des caractères alphabétiques, non ce n'est pas le "2" = "ABC" que vous voyez sur les téléphones à clavier.

+0

Mon application stocke uniquement les numéros américains dans le format à 10 chiffres. Si des extensions sont nécessaires, elles seront stockées dans un champ séparé. Nous stockons des chiffres pour la comparaison, car les numéros de téléphone entrés devront être comparés et éliminer toutes les garanties non numériques garantit que le formatage de l'utilisateur ne cassera pas cela. –

6

La version simple:

string phone = "6365555796"; 
Convert.ToInt64(phone).ToString("000-000-0000"); 

Pour envelopper une validation autour de cela et le mettre dans une belle méthode:

string FormatPhone(string phone) 
{ 
    /*assume the phone string came from the database, so we already know it's 
    only digits. If this changes in the future a simple RegEx can validate 
    (or correct) the digits requirement. */ 

    // still want to check the length: 
    if (phone.Length != 10) throw new InvalidArgumentException(); 

    return Convert.ToInt64(phone).ToString("000-000-0000"); 
} 
1

Je me aime une action de méthode d'extension:

/// <summary> 
    /// Formats a string of nine digits into a U.S. phone number. 
    /// </summary> 
    /// <param name="value"> 
    /// The string to format as a phone number. 
    /// </param> 
    /// <returns> 
    /// The numeric string as a U.S. phone number. 
    /// </returns> 
    public static string 
    ToUSPhone (this string value) 
    { 
     if (value == null) 
     { 
     return null; 
     } 

     long dummy; 

     if ((value.Length != 10) || 
     !long.TryParse (
      value, 
      NumberStyles.None, 
      CultureInfo.CurrentCulture, 
      out dummy)) 
     { 
     return value; 
     } 

     return string.Format (
     CultureInfo.CurrentCulture, 
     "{0}-{1}-{2}", 
     value.Substring (0, 3), 
     value.Substring (3, 3), 
     value.Substring (6)); 
    }