2010-02-19 2 views
3

En utilisant C#, quel est le moyen le plus efficace d'y parvenir?C# Comment remplacer des parties d'une chaîne par des parties d'une autre

string one = "(999) 999-9999"; 
string two = "2221239876"; 

// combine these into result 

result = "(222) 123-9876" 

La chaîne 1 aura toujours 9.

Je pense à une sorte de foreach sur la chaîne un et quand il voit un 9, remplacez-le par le caractère suivant dans la chaîne deux. Pas tout à fait sûr où aller à partir de là que ...

+0

Le point d'interrogation signifie-t-il qu'il peut y avoir ou non un chiffre dans le premier emplacement. Pour l'exempleavec un masque de 9? 9999 se traduirait par 0123? –

+0

Voulez-vous simplement formater une chaîne de 10 numéros en tant que numéro de téléphone? Parce que, il ya un moyen plus facile de le faire dans C# –

+0

@Yuriy - Simplifié la question en supprimant le point d'interrogation. @Chris - Oui, je pourrais utiliser String.Format pour un numéro de téléphone. Mais je me pose des questions sur tout type de masque ici. Un peu d'académique :) – macca1

Répondre

12

Si vous souhaitez appliquer un format à un certain nombre, vous pouvez essayer ceci:

long number = 2221239876; 
string result = number.ToString("(###) ### ####"); // Result: (222) 123 9876 

Pour plus d'informations, consultez Custom Numeric Format Strings dans le .NET Documentation du cadre.

0

Je ne sais pas exactement à quel point vous attendez que le motif (la chaîne 'un') diffère. Si vous avez toujours l'impression que vous l'avez montré, vous pourriez peut-être simplement remplacer les neuf par "#" et utiliser un .ToString (...).

Sinon, vous devrez peut-être faire quelque chose comme

 string one = "(9?99) 999-9999"; 
     string two = "2221239876"; 

     StringBuilder sb = new StringBuilder(); 
     int j = 0; 
     for (int i = 0; i < one.Length; i++) 
     { 
      switch (one[i]) 
      { 
       case '9': sb.Append(two[j++]); 
        break; 
       case '?': /* Ignore */ 
        break; 
       default: 
        sb.Append(one[i]); 
        break; 
      } 
     } 

De toute évidence, vous devriez vérifier pour vous assurer qu'aucune exception de IndexOutOfRange se produire si une chaîne est « plus » que l'autre (qui est, « un » contient plus de neuf que la longueur de 'deux' etc.)

1
string one = "(999) 999-9999"; 
string two = "2221239876"; 

StringBuilder result = new StringBuilder(); 

int indexInTwo = 0; 
for (int i = 0; i < one.Length; i++) 
{ 
    char character = one[i]; 
    if (char.IsDigit(character)) 
    { 
     if (indexInTwo < two.Length) 
     { 
      result.Append(two[indexInTwo]); 
      indexInTwo++; 
     } 
     else 
     { 
      // ran out of characters in two 
      // use default character or throw exception? 
     } 
    } 
    else 
    { 
     result.Append(character); 
    } 
} 
Questions connexes