56 votes

Comment convertir un int en chaîne en C # sans utiliser ToString ()?

Convertir les suivantes argument int dans une chaîne sans utiliser de native toString de la fonctionnalité.

public string integerToString(int integerPassedIn){    
    //Your code here
}

Depuis tout hérite d' Object et Object a ToString() méthode comment voulez-vous convertir un int d'un string sans l'aide de la native ToString() méthode?

Le problème avec la concaténation de chaîne est qu'il va appeler ToString() jusqu'à la chaîne jusqu'à ce qu'il frappe l'un ou frappe l' Object classe.

Comment voulez-vous convertir un entier en une chaîne de caractères en C# sans l'aide d' ToString()?

74voto

p.s.w.g Points 81433

Quelque chose comme ceci:

public string IntToString(int a)
{    
    var chars = new[] { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" };
    var str = string.Empty;
    if (a == 0)
    {
        str = chars[0];
    }
    else if (a == int.MinValue)
    {
        str = "-2147483648";
    }
    else
    {
        bool isNegative = (a < 0);
        if (isNegative)
        {
            a = -a;
        }

        while (a > 0)
        {
            str = chars[a % 10] + str;
            a /= 10;
        }

        if (isNegative)
        {
            str = "-" + str;
        }
    }

    return str;
}

Mise à jour: Voici une autre version qui est plus court et doit faire beaucoup mieux, car elle élimine tous concaténation de chaîne en faveur de la manipulation d'une longueur fixe de tableau. Il prend en charge les bases de jusqu'à 16 ans, mais il serait facile de l'étendre à l'augmentation des bases. Il pourrait sans doute être améliorée:

public string IntToString(int a, int radix)
{
    var chars = "0123456789ABCDEF".ToCharArray();
    var str = new char[32]; // maximum number of chars in any base
    var i = str.Length;
    bool isNegative = (a < 0);
    if (a <= 0) // handles 0 and int.MinValue special cases
    {
        str[--i] = chars[-(a % radix)];
        a = -(a / radix);
    }

    while (a != 0)
    {
        str[--i] = chars[a % radix];
        a /= radix;
    }

    if (isNegative)
    {
        str[--i] = '-';
    }

    return new string(str, i, str.Length - i);
}

22voto

joe Points 2314

C'est la solution que j'ai toujours utiliser:

    public static string numberBaseChars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

    public static string IntToStringWithBase(int n, int b) {
        return IntToStringWithBase(n, b, 1);
    }

    public static string IntToStringWithBase(int n, int b, int minDigits) {
        if (minDigits < 1) minDigits = 1;
        if (n == 0) return new string('0', minDigits);
        string s = "";
        if ((b < 2) || (b > numberBaseChars.Length)) return s;
        bool neg = false;
        if ((b == 10) && (n < 0)) { neg = true; n = -n; }
        uint N = (uint)n;
        uint B = (uint)b;
        while ((N > 0) | (minDigits-- > 0)) {
            s = numberBaseChars[(int)(N % B)] + s;
            N /= B;
        }
        if (neg) s = "-" + s;
        return s;
    }

Cela semble assez compliqué mais a les caractéristiques suivantes:

  • Prend en charge radix 2 à 36
  • Poignées de valeurs négatives
  • En option nombre total de chiffres

9voto

lc. Points 50297

Je ne suis pas vraiment convaincu de la concaténation operator + des appels ToString, mais si cela est vrai, vous pouvez éviter ces deux, en faisant quelque chose comme ce qui suit:

if (a == 0) return "0";   

/* Negative maxint doesn't have a corresponding positive value, so handle it
 * as a special case. Thanks to @Daniel for pointing this out.
 */
if (a == 0x80000000) return "-2147483648";

List<char> l = new List<char>();
bool negative = false;

if (a < 0) 
{
    negative = true;
    a *= -1;
}

while (a > 0)
{
    l.Add('0' + (char)(a % 10));
    a /= 10;
}

if (negative) l.Add('-');

l.Reverse();

return new String(l.ToArray());

5voto

Martin Liversage Points 43712

L'entier est traitée à partir de la du chiffre le moins significatif le plus significatif. Un seul chiffre est calculé utilisé modulo 10 (%10) qui est ensuite ajoutée à la valeur du caractère de '0'. Il en résulte l'un des personnages '0', '1', ... , '9'.

Les chiffres sont poussés dans une pile, car ils doivent être présentés dans l'ordre inverse qu'ils sont traités (la plus importante du chiffre le chiffre le moins significatif). Le faire comme ceci au lieu de cela, à plusieurs reprises, ajoutant les chiffres d'une chaîne de caractères peut être plus efficace, mais parce que le nombre de chiffres est assez faible, vous devez effectuer un test pour en être sûr.

Traitement supplémentaire est nécessaire pour gérer la non-positif numéros.

public string IntToString(int a) {
  if (a == 0)
    return "0";
  if (a == int.MinValue)
    return "-2147483648";
  var isNegative = false;
  if (a < 0) {
    a = -a;
    isNegative = true;
  }
  var stack = new Stack<char>();
  while (a != 0) {
    var c = a%10 + '0';
    stack.Push((char) c);
    a /= 10;
  }
  if (isNegative)
    stack.Push('-');
  return new string(stack.ToArray());
}

Ma première version utilisé un StringBuilder pour créer la chaîne à partir du tableau de caractères de la chaîne "de la" StringBuilder nécessite un appel à la méthode nommée ToString. Évidemment, cette méthode ne permet pas de faire tout l'int de conversion de chaîne de caractères qui pour moi, est ce que cette question est à propos.

Mais pour prouver que vous pouvez créer une chaîne sans appel ToString je suis passé à l'aide d'un string constructeur qui je voudrais également assumer d'être plus efficace par rapport à l'aide d'un StringBuilder.

Et si ToString sous quelque forme, est interdite, vous ne pouvez pas utiliser la concaténation de chaîne comme on le voit dans la documentation pour l' string.Concat:

La méthode concatène arg0 et arg1by sans paramètre de l'appel de la méthode ToString de arg0 et arg1; il n'ajoute pas les délimiteurs.

si l'exécution d' s += '1' appellerons '1'.ToString(). Mais pour moi, ce n'est pas important. L'important, c'est comment vous convertir un int en une chaîne de caractères.

4voto

Timothy Shields Points 17970

En visant une version plus courte, et qui utilise Math.DivRem:

string IntToString(int a)
{
    if (a == int.MinValue)
        return "-2147483648";
    if (a < 0)
        return "-" + IntToString(-a);
    if (a == 0)
        return "0";
    var s = "";
    do
    {
        int r;
        a = Math.DivRem(a, 10, out r);
        s = new string((char)(r + (int)'0'), 1) + s;
    }
    while (a > 0);
    return s;
}

L'utilisation de l' new string(..., 1) constructeur n'est qu'un moyen de satisfaire l'exigence de l'OP qui ToString de ne pas être appelé sur quoi que ce soit.

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