77 votes

Fractionner une chaîne / un nombre chaque Nième caractère / nombre?

J'ai besoin de partager un nombre en parties par exemple:
32427237 doit devenir 324 272 37
103092501 doit devenir 103 092 501

Je suis sûr que je pourrais juste pour-suivant les chiffres, mais je suis sûr qu'il y est un moyen plus efficace que je ne veux pas manquer les personnages de ces nombres - les nombres eux-mêmes peuvent être n'importe quelle longueur, de sorte que si le nombre 1234567890 je voudrais diviser en ces pièces 123 456 789 0

J'ai vu des exemples dans d'autres langages comme Python, etc, mais je ne comprends pas assez bien pour les convertir en C# - bouclage bien que les personnages et puis à la troisième obtention de la précédente et alors que l'indice pour obtenir la section de la chaîne peut faire le travail, mais je suis ouvert aux suggestions sur la façon de le faire mieux.

139voto

Martin Liversage Points 43712

Si vous devez le faire à de nombreux endroits dans votre code, vous pouvez créer une méthode d'extension sophistiquée:

 static class StringExtensions {

  public static IEnumerable<String> SplitInParts(this String s, Int32 partLength) {
    if (s == null)
      throw new ArgumentNullException("s");
    if (partLength <= 0)
      throw new ArgumentException("Part length has to be positive.", "partLength");

    for (var i = 0; i < s.Length; i += partLength)
      yield return s.Substring(i, Math.Min(partLength, s.Length - i));
  }

}
 

Vous pouvez ensuite l'utiliser comme ceci:

 var parts = "32427237".SplitInParts(3);
Console.WriteLine(String.Join(" ", parts));
 

La sortie est 324 272 37 comme vous le souhaitez.

10voto

0xA3 Points 73439

Vous pouvez utiliser une simple boucle for pour insérer des blancs à chaque n-ième position:

 string input = "12345678";
StringBuilder sb = new StringBuilder();
for (int i = 0; i < input.Length; i++)
{
    if (i % 3 == 0)
        sb.Append(' ');
    sb.Append(input[i]);
}
string formatted = sb.ToString();
 

7voto

Binary Worrier Points 27424

Un moyen très simple de faire cela (pas le plus efficace, mais pas des ordres de grandeur plus lent que le plus efficace).

     public static List<string> GetChunks(string value, int chunkSize)
    {
        List<string> triplets = new List<string>();
        while (value.Length > chunkSize)
        {
            triplets.Add(value.Substring(0, chunkSize));
            value = value.Substring(chunkSize);
        }
        if (value != "")
            triplets.Add(value);
        return triplets;
    }
 

Heres un remplaçant

     public static List<string> GetChunkss(string value, int chunkSize)
    {
        List<string> triplets = new List<string>();
        for(int i = 0; i < value.Length; i += chunkSize)
            if(i + chunkSize > value.Length)
                triplets.Add(value.Substring(i));
            else
                triplets.Add(value.Substring(i, chunkSize));

        return triplets;
    }
 

7voto

QrystaL Points 2606

Règles LINQ:

 var input = "1234567890";
var parts = 3;

var output = input.ToCharArray()
    .BufferWithCount(parts)
    .Select(c => new String(c.ToArray()));
 

MIS À JOUR:

 string input = "1234567890";
double parts = 3;
int k = 0;
var output = input
    .ToLookup(c => Math.Floor(k++ / parts))
    .Select(e => new String(e.ToArray()));
 

2voto

steinar Points 4762

Je ferais quelque chose comme ça, même si je suis sûr qu'il y a d'autres moyens. Devrait bien performer.

 public static string Format(string number, int batchSize, string separator)
{      
  StringBuilder sb = new StringBuilder();
  for (int i = 0; i <= number.Length / batchSize; i++)
  {
    if (i > 0) sb.Append(separator);
    int currentIndex = i * batchSize;
    sb.Append(number.Substring(currentIndex, 
              Math.Min(batchSize, number.Length - currentIndex)));
  }
  return sb.ToString();
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X