Comment puis-je convertir un Int en une Chaîne de caractères en C# sans l'aide de ToString()?
Convertir les suivantes argument int dans une chaîne sans utiliser de native toString fonctionnalité.
public string integerToString(int integerPassedIn){ //Your code here }
Depuis tout ce hérite de Object
et Object
a un ToString()
méthode comment voulez-vous convertir un int
à un string
sans l'aide de la maternelle ToString()
méthode?
Le problème de concaténation de chaîne est qu'il va appeler ToString()
de la chaîne jusqu'à ce qu'il frappe l'un ou frappe les Object
classe.
Comment voulez-vous convertir un entier en une chaîne de caractères en C# sans l'aide de ToString()
?
- Itérer sur les int mod 10, et de les enchaîner dans de nouvelles chaînes semble que c'est ce qu'ils recherchent, mais vous avez dit concaténation des appels toString?
String str = "" + a;
pourrait appeler toString sur un, je pense, est ce que @AMR moyens- Oui, si vous utiliser la concaténation finalement, il va appeler une fonction toString.
- Même si vous êtes à la concaténation de deux chaînes? Qui n'a pas beaucoup de sens. Je pourrais voir si vous faites ce que @bizzehdee dit, mais je pense concaténations de chaîne n'ont aucune raison de l'appeler ToString().
- Nous ne sommes pas de la connexion de deux chaînes. Si un non-type de chaîne est concatinated avec une chaîne, il appelle toString. De vérifier la première réponse ici stackoverflow.com/questions/3759343/automatic-tostring @Gris
- Je pense que vous vous méprenez alors, je vous parlais de la concaténation de chaînes comme on le voit dans p.s.w.g.'s réponse, à l'exception, il pourrait juste être un tableau de chaînes de caractères plutôt que de caractères.
- StringBuilder.Append((char)((a % 10) + '0'))
- Cette question de l'entrevue est intéressant non seulement parce que le candidat peut démontrer s'il est en mesure de venir avec un algorithme pour convertir un int en une chaîne sans appelant simplement
123.ToString()
. À un certain moment dans l'algorithme, le candidat devra créer une chaîne, peut-être à partir de caractères, et la fonction utilisée peut être nomméToString
. Les candidats qui sont obsédé par le nom deToString
au lieu de résoudre le problème réel à portée de main sera plus facile à identifier. - Quelqu'un a dû mettre en œuvre ToString sans appeler ToString. Comment pensez-vous qu'ils ont fait?
- La magie noire... Ou @EricLippert fait...
- M'a fait curieux, ce blog est très intéressant. technotes-bipan.blogspot.com/2008/08/boxing-unboxing-in-c.html
- Pourquoi demandez-vous cette question? C'était une interview/devoirs question, ou vous êtes simplement curieux?
- cela a tourné en int pour le code de chaîne de golf en c#
- Ne serait-ce pas un travail facile?
int MyInt = 25; MyStringBuilder.AppendFormat("{0:C} ", MyInt);
Vous devez vous connecter pour publier un commentaire.
Quelque chose comme ceci:
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:
int.MinValue
-
.ToString()
méthode de sous les couvertures?ToString()
, comme la concaténation d'unchar
avec unstring
utilisera lestring.Concat(object, object)
la surcharge des appelsToString
sur ses arguments. Mais c'est facile à fixer à l'aide d'un tableau de chaînes de caractères à la place.var chars
permettra de résoudre le problèmenew String("1", a)
, je n'ai pas ressenti cela a été suffisamment important pour être inclus ici.C'est la solution que j'ai toujours utiliser:
Cela semble assez compliqué mais a les caractéristiques suivantes:
0016I2WM
. C'est, comme beaucoup est je sais, pas possible avec n'importe quel.ToString()
. Sont t-il de meilleures façons de faire?Je ne suis pas vraiment convaincu de la concaténation
operator +
appelsToString
, mais si cela est vrai, vous pouvez éviter ces deux, en faisant quelque chose comme ce qui suit:+
opérateur appelsToString
pour l'une des surcharges dans lequel un opérande est de typeobject
. Lorsque les deux opérandes sont de type string, il ne le fait pas.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.
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éeToString
. É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'unstring
constructeur qui je voudrais également assumer d'être plus efficace par rapport à l'aide d'unStringBuilder
.Et si
ToString
dans toutes ses formes, est interdite, vous ne pouvez pas utiliser la concaténation de chaîne comme on le voit dans la documentation destring.Concat
:afin d'exécution
s += '1'
appellera'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.ToString()
appel sur la fin...ToString
pour satisfaire les commentateurs et même fourni une réponse qui n'utilise pasToString
comme la concaténation de chaîne n'derrière les coulisses.Visant pour une version plus courte, et qui utilise
Math.DivRem
:L'utilisation de la
new string(..., 1)
constructeur n'est qu'un moyen de satisfaire l'exigence de l'OP quiToString
pas être appelée sur quoi que ce soit.Voici mon prend sur elle à l'aide de l'itération et de la récursivité avec des temps d'exécution de l'analyse.
Points Clés
Analyse
La suivante est l'analyse de l'exécution des deux méthodes par rapport à la norme
ToString()
sur mon ordinateur.Les résultats indiquent l'itération et la récursivité des méthodes d'exécuter 5,49 et 5.00 fois plus lente que la norme
ToString()
méthode.Et voici le code que j'ai utilisé pour l'analyse:
vous pouvez convertir n'importe quel chiffre pour un char comme ça
Le nombre magique
48
est la valeur ASCII du char0
et ils sont séquentiels dans la table ASCII ainsi, vous pouvez simplement ajouter les chiffres pour obtenir la valeur correspondante dans la table ASCII.et vous pouvez obtenir les chiffres de l'entier de manière itérative à l'aide de l'opérateur de modulo
%
D'emprunt de la structure générale du groupe de travail, vous obtiendrez
La récursivité:
Si c'est le c++, alors:
string(p)
est un natif de fonction c++... ou, au moins, il fait partie de la bibliothèque std.