Mettre en forme la chaîne avec des tirets

J’ai une valeur de chaîne compressée que je suis en train d’extraire d’un fichier d’importation. J’ai besoin de formater ceci en un numéro de plot, qui est formaté comme suit: ##-##-##-###-### . La chaîne “410151000640” devrait donc devenir “41-01-51-000-640”. Je peux le faire avec le code suivant:

 Ssortingng.Format("{0:##-##-##-###-###}", Convert.ToInt64("410151000640")); 

Cependant, la chaîne peut ne pas être tous les nombres; il pourrait y avoir une lettre ou deux, et donc la conversion en int échouera. Y at-il un moyen de faire cela sur une chaîne de sorte que chaque caractère, qu’il s’agisse d’un chiffre ou d’une lettre, s’intégrera correctement dans le format?

 Regex.Replace("410151000640", @"^(.{2})(.{2})(.{2})(.{3})(.{3})$", "$1-$2-$3-$4-$5"); 

Ou la version légèrement plus courte

 Regex.Replace("410151000640", @"^(..)(..)(..)(...)(...)$", "$1-$2-$3-$4-$5"); 

Je voudrais aborder cela en ayant votre propre méthode de formatage, tant que vous savez que le “numéro de plot” est toujours conforme à une règle spécifique.

 public static ssortingng FormatParcelNumber(ssortingng input) { if(input.length != 12) throw new FormatException("Invalid parcel number. Must be 12 characters"); return Ssortingng.Format("{0}-{1}-{2}-{3}-{4}", input.Subssortingng(0,2), input.Subssortingng(2,2), input.Subssortingng(4,2), input.Subssortingng(6,3), input.Subssortingng(9,3)); } 

Cela devrait fonctionner dans votre cas:

 ssortingng value = "410151000640"; for( int i = 2; i < value.Length; i+=3){ value = value.Insert( i, "-"); } 

Maintenant, la value contient la chaîne avec les tirets insérés.

MODIFIER

Je viens de voir que vous n'aviez pas de tiret entre chaque deuxième chiffre, cela nécessiterait un petit ajustement (et le rend un peu plus maladroit aussi, j'ai bien peur).

 ssortingng value = "410151000640"; for( int i = 2; i < value.Length-1; i+=3){ if( value.Count( c => c == '-') >= 3) i++; value = value.Insert( i, "-"); } 

Si cela fait partie de l’interface utilisateur, vous pouvez utiliser MaskedTextProvider dans System.ComponentModel

  MaskedTextProvider prov = new MaskedTextProvider("aa-aa-aa-aaa-aaa"); prov.Set("41x151000a40"); ssortingng result = prov.ToDisplaySsortingng(); 

Si je vous ai bien compris, vous cherchez une fonction qui supprime toutes les lettres d’une chaîne, n’est-ce pas?

J’ai créé ceci à la volée, vous pouvez peut-être le convertir en c # si c’est ce que vous cherchez:

 Dim str As Ssortingng = "410151000vb640" str = Ssortingng.Format("{0:##-##-##-###-###}", Convert.ToInt64(MakeNumber(str))) Public Function MakeNumber(ByVal ssortingngInt As Ssortingng) As Ssortingng Dim sb As New System.Text.SsortingngBuilder For i As Int32 = 0 To ssortingngInt.Length - 1 If Char.IsDigit(ssortingngInt(i)) Then sb.Append(ssortingngInt(i)) End If Next Return sb.ToSsortingng End Function 

Voici une méthode d’extension simple avec un utilitaire:

  public static ssortingng WithMask(this ssortingng s, ssortingng mask) { var slen = Math.Min(s.Length, mask.Length); var charArray = new char[mask.Length]; var sPos = s.Length - 1; for (var i = mask.Length - 1; i >= 0 && sPos >= 0;) if (mask[i] == '#') charArray[i--] = s[sPos--]; else charArray[i] = mask[i--]; return new ssortingng(charArray); } 

Utilisez-le comme suit:

  var s = "276000017812008"; var mask = "###-##-##-##-###-###"; var dashedS = s.WithMask(mask); 

Vous pouvez l’utiliser avec n’importe quelle chaîne et tout caractère autre que # dans le masque sera inséré. Le masque fonctionnera de droite à gauche. Vous pouvez le modifier pour aller dans l’autre sens si vous voulez.

S’amuser.