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
etObject
aToString()
méthode comment voulez-vous convertir unint
d'unstring
sans l'aide de la nativeToString()
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()
?
Réponses
Trop de publicités?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);
}
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
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());
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.
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.