如何将char数组转换为int
How to convert char array to int
我怎么找不到这个的解决方案?
所以我有一个包含数字的 char
数组,我希望它们连接在一起成为 int
。
我尝试了Convert.ToInt32
、int.parse
string.join
等技巧,但要么不知道如何正确使用,要么不适合这份工作。
这是一个通过返回一个值给测试的赋值,我得到的是:System.FormatException:输入字符串的格式不正确。这就是我知道有问题的方式。
到目前为止我的代码(重点评论):
public static int? NextBiggerThan(int number)
{
if (number < 0)
{
throw new ArgumentException(null);
}
else
{
char[] digit = number.ToString(CultureInfo.InvariantCulture.NumberFormat).ToCharArray();
int n = digit.Length;
//
for (int z = 0; z < n; z++)
{
digit[z] -= '0';
}
int i;
for (i = n - 1; i > 0; i--)
{
if (digit[i] > digit[i - 1])
{
break;
}
}
if (i == 0)
{
return null;
}
else
{
int x = digit[i - 1], min = i;
for (int j = i + 1; j < n; j++)
{
if (digit[j] > x && digit[j] < digit[min])
{
min = j;
}
}
Swap(digit, i - 1, min);
Array.Sort(digit, i, n - i);
// number = ?????
return number;
}
}
}
public static void Swap(char[] digit, int i, int j)
{
char temp = digit[i];
digit[i] = digit[j];
digit[j] = temp;
}
其余代码工作正常,如果我 return
例如 digit[0]
,那么它 returns 我想要的值,但是当我尝试在最后连接所有内容时出错了。
Join
和 int.Parse
工作正常:
namespace SandboxTests
{
public static class Extension
{
public static int ToInt(this char[] arr)
{
var str = string.Join("", arr);
return int.Parse(str);
}
}
[TestClass]
public class JoinParseTests
{
[TestMethod]
public void ExtensionToIntTest()
{
var sut = new[] { '3', '2', '1' };
var intResult = sut.ToInt();
Assert.AreEqual(321, intResult); // green
}
}
}
你真的应该帮助我们帮助你,将你发布的代码限制在手头的问题上。也就是说,您可以加入并解析数字的字符数组:
using System;
public class Program
{
public static void Main()
{
char[] inNumberArray = new char[]{'1','2','0','5'};
var asString = string.Join("", inNumberArray);
var asInt = int.TryParse(asString, out int outNum)?outNum:0;
Console.WriteLine($"asString: {asString}");
Console.WriteLine($"asInt: {asInt}");
}
}
输出:
asString: 1205
asInt: 1205
我们可以结合两个事实:
- 字符可以像整数一样处理并减去
- 在 ascii 中,数字“0”到“9”按顺序出现。
这意味着,例如 '5'
的字符减去 '0'
的字符是 5
的整数
LINQ 有一个方法可以做到这一点;我们 运行 一个聚合,我们用 0 作为种子,并重复将这个起始 int 值(0)乘以 10 并将数字添加到它
var arr = new []{'9','8','4','2','5'};
var sum = arr.Aggregate(0, (acc, x) => acc*10 + x - '0');
你也可以在没有 LINQ 的情况下做到这一点:
var arr = new []{'9','8','4','2','5'};
var sum = 0;
foreach(char c in arr)
sum = sum*10 + (x-'0');
总的来说,此方法主要基于数学,避免将所有内容连接到字符串并对其进行解析应该意味着它是一个资源密集度较低的选项
我怎么找不到这个的解决方案?
所以我有一个包含数字的 char
数组,我希望它们连接在一起成为 int
。
我尝试了Convert.ToInt32
、int.parse
string.join
等技巧,但要么不知道如何正确使用,要么不适合这份工作。
这是一个通过返回一个值给测试的赋值,我得到的是:System.FormatException:输入字符串的格式不正确。这就是我知道有问题的方式。
到目前为止我的代码(重点评论):
public static int? NextBiggerThan(int number)
{
if (number < 0)
{
throw new ArgumentException(null);
}
else
{
char[] digit = number.ToString(CultureInfo.InvariantCulture.NumberFormat).ToCharArray();
int n = digit.Length;
//
for (int z = 0; z < n; z++)
{
digit[z] -= '0';
}
int i;
for (i = n - 1; i > 0; i--)
{
if (digit[i] > digit[i - 1])
{
break;
}
}
if (i == 0)
{
return null;
}
else
{
int x = digit[i - 1], min = i;
for (int j = i + 1; j < n; j++)
{
if (digit[j] > x && digit[j] < digit[min])
{
min = j;
}
}
Swap(digit, i - 1, min);
Array.Sort(digit, i, n - i);
// number = ?????
return number;
}
}
}
public static void Swap(char[] digit, int i, int j)
{
char temp = digit[i];
digit[i] = digit[j];
digit[j] = temp;
}
其余代码工作正常,如果我 return
例如 digit[0]
,那么它 returns 我想要的值,但是当我尝试在最后连接所有内容时出错了。
Join
和 int.Parse
工作正常:
namespace SandboxTests
{
public static class Extension
{
public static int ToInt(this char[] arr)
{
var str = string.Join("", arr);
return int.Parse(str);
}
}
[TestClass]
public class JoinParseTests
{
[TestMethod]
public void ExtensionToIntTest()
{
var sut = new[] { '3', '2', '1' };
var intResult = sut.ToInt();
Assert.AreEqual(321, intResult); // green
}
}
}
你真的应该帮助我们帮助你,将你发布的代码限制在手头的问题上。也就是说,您可以加入并解析数字的字符数组:
using System;
public class Program
{
public static void Main()
{
char[] inNumberArray = new char[]{'1','2','0','5'};
var asString = string.Join("", inNumberArray);
var asInt = int.TryParse(asString, out int outNum)?outNum:0;
Console.WriteLine($"asString: {asString}");
Console.WriteLine($"asInt: {asInt}");
}
}
输出:
asString: 1205
asInt: 1205
我们可以结合两个事实:
- 字符可以像整数一样处理并减去
- 在 ascii 中,数字“0”到“9”按顺序出现。
这意味着,例如 '5'
的字符减去 '0'
的字符是 5
LINQ 有一个方法可以做到这一点;我们 运行 一个聚合,我们用 0 作为种子,并重复将这个起始 int 值(0)乘以 10 并将数字添加到它
var arr = new []{'9','8','4','2','5'};
var sum = arr.Aggregate(0, (acc, x) => acc*10 + x - '0');
你也可以在没有 LINQ 的情况下做到这一点:
var arr = new []{'9','8','4','2','5'};
var sum = 0;
foreach(char c in arr)
sum = sum*10 + (x-'0');
总的来说,此方法主要基于数学,避免将所有内容连接到字符串并对其进行解析应该意味着它是一个资源密集度较低的选项