簡體   English   中英

在 C# 中將 char 轉換為 int

[英]Convert char to int in C#

我在 c# 中有一個字符:

char foo = '2';

現在我想把 2 變成一個整數。 我發現 Convert.ToInt32 返回 char 的實際十進制值而不是數字 2。以下將起作用:

int bar = Convert.ToInt32(new string(foo, 1));

int.parse 也只適用於字符串。

C# 到 go 中沒有原生的 function 從 char 到 int 沒有做成字符串嗎? 我知道這是微不足道的,但似乎奇怪的是沒有任何原生的東西可以直接進行轉換。

這會將其轉換為int

char foo = '2';
int bar = foo - '0';

這是有效的,因為每個字符在內部都由一個數字表示。 字符'0''9'由連續的數字表示,因此找到字符'0''2'之間的差異會得到數字 2。

有趣的答案,但文檔的說法不同:

使用GetNumericValue方法將表示數字的Char對象轉換為數值類型。 使用ParseTryParse將字符串中的字符轉換為Char對象。 使用ToStringChar對象轉換為String對象。

http://msdn.microsoft.com/en-us/library/system.char.aspx

有沒有人考慮過像這樣使用int.Parse()int.TryParse()

int bar = int.Parse(foo.ToString());

像這樣更好

int bar;
if (!int.TryParse(foo.ToString(), out bar))
{
    //Do something to correct the problem
}

它更安全,更不容易出錯

char c = '1';
int i = (int)(c - '0');

您可以從中創建一個靜態方法:

static int ToInt(this char c)
{
    return (int)(c - '0');
}

嘗試這個

char x = '9'; // '9' = ASCII 57

int b = x - '0'; //That is '9' - '0' = 57 - 48 = 9

默認情況下你使用UNICODE所以我建議使用faulty的方法

int bar = int.Parse(foo.ToString());

即使數字和基本拉丁字符下的數值相同。

這將轉換為整數並處理 unicode

CharUnicodeInfo.GetDecimalDigitValue('2')

你可以在這里閱讀更多。

原則:

char foo = '2';
int bar = foo & 15;

ASCII 字符 0-9 的二進制是:

0   -   0011 0000
1   -   0011 0001
2   -   0011 0010
3   -   0011 0011
4   -   0011 0100
5   -   0011 0101
6   -   0011 0110
7   -   0011 0111
8   -   0011 1000
9   -   0011 1001

如果你把它們中的每一個都取進去前 4 個 LSB(使用按位與 8'b00001111 等於 15)你會得到實際數字(0000 = 0,0001=1,0010=2,...)

用法:

public static int CharToInt(char c)
{
    return 0b0000_1111 & (byte) c;
}

真正的方法是:

int theNameOfYourInt = (int).Char.GetNumericValue(theNameOfYourChar);

"theNameOfYourInt" - 您希望將 char 轉換為的 int。

"theNameOfYourChar" - 您要使用的 Char,以便將其轉換為 int。

讓其他一切保持不變。

我同意@Chad Grant

同樣正確的是,如果您轉換為字符串,那么您可以將該值用作問題中所述的數字

int bar = Convert.ToInt32(new string(foo, 1)); // => gives bar=2

我試圖創建一個更簡單易懂的例子

char v = '1';
int vv = (int)char.GetNumericValue(v); 

char.GetNumericValue(v) 以 double 形式返回並轉換為 (int)

作為數組的更多高級用法

int[] values = "41234".ToArray().Select(c=> (int)char.GetNumericValue(c)).ToArray();

首先將字符轉換為字符串,然后再轉換為整數。

var character = '1';
var integerValue = int.Parse(character.ToString());

我正在使用 Compact Framework 3.5,並且沒有“char.Parse”方法。 我認為使用 Convert 類還不錯。 (通過 C# 參見 CLR,Jeffrey Richter)

char letterA = Convert.ToChar(65);
Console.WriteLine(letterA);
letterA = 'あ';
ushort valueA = Convert.ToUInt16(letterA);
Console.WriteLine(valueA);
char japaneseA = Convert.ToChar(valueA);
Console.WriteLine(japaneseA);

適用於 ASCII 字符或 Unicode 字符

根據字符不是ASCII數字時的結果比較一些方法:

char c1 = (char)('0' - 1), c2 = (char)('9' + 1); 

Debug.Print($"{c1 & 15}, {c2 & 15}");                                   // 15, 10
Debug.Print($"{c1 ^ '0'}, {c2 ^ '0'}");                                 // 31, 10
Debug.Print($"{c1 - '0'}, {c2 - '0'}");                                 // -1, 10
Debug.Print($"{(uint)c1 - '0'}, {(uint)c2 - '0'}");                     // 4294967295, 10
Debug.Print($"{char.GetNumericValue(c1)}, {char.GetNumericValue(c2)}"); // -1, -1

用這個:

public static string NormalizeNumbers(this string text)
{
    if (string.IsNullOrWhiteSpace(text)) return text;

    string normalized = text;

    char[] allNumbers = text.Where(char.IsNumber).Distinct().ToArray();

    foreach (char ch in allNumbers)
    {
        char equalNumber = char.Parse(char.GetNumericValue(ch).ToString("N0"));
        normalized = normalized.Replace(ch, equalNumber);
    }

    return normalized;
}

一種將字符 0-9 轉換為整數的快速簡單方法:C# 將 char 值視為整數。

字符 c = '7'; (ascii 碼 55) int x = c - 48; (結果 = 7 的整數)

使用Uri.FromHex
並避免異常Uri.IsHexDigit

char testChar = 'e';
int result = Uri.IsHexDigit(testChar) 
               ? Uri.FromHex(testChar)
               : -1;

我被搜索到了最優化的方法,並且非常驚訝地發現最好的方法是最簡單的(也是最流行的答案):

public static int ToIntT(this char c) =>
    c is >= '0' and <= '9'?
        c-'0' : -1;

有一個我嘗試過的方法列表:

c-'0' //current
switch //about 25% slower, no method with disabled isnum check (it is but performance is same as with enabled)
0b0000_1111 & (byte) c; //same speed
Uri.FromHex(c) /*2 times slower; about 20% slower if use my isnum check*/ (c is >= '0' and <= '9') /*instead of*/ Uri.IsHexDigit(testChar)
(int)char.GetNumericValue(c); // about 20% slower. I expected it will be much more slower.
Convert.ToInt32(new string(c, 1)) //3-4 times slower

請注意,isnum 檢查(第一個代碼塊中的第 2 行)占用約 30% 的性能,因此如果您確定c是 char,則應將其關閉。 測試誤差約為 5%

我更喜歡切換方法。 性能與 c - '0' 相同,但我發現該開關更易於閱讀。

基准:

方法 意思 錯誤 標准偏差 分配的內存/操作
字符減0 90.24 我們 7.1120 我們 0.3898 我們 39.18 KB
字符開關 90.54 我們 0.9319 我們 0.0511 我們 39.18 KB

代碼:

public static int CharSwitch(this char c, int defaultvalue = 0) {
    switch (c) {
        case '0': return 0;
        case '1': return 1;
        case '2': return 2;
        case '3': return 3;
        case '4': return 4;
        case '5': return 5;
        case '6': return 6;
        case '7': return 7;
        case '8': return 8;
        case '9': return 9;
        default: return defaultvalue;
    }
}
public static int CharMinus0(this char c, int defaultvalue = 0) {
    return c >= '0' && c <= '9' ? c - '0' : defaultvalue;
}

這對我有用:

int bar = int.Parse("" + foo);

我看過很多答案,但他們似乎讓我感到困惑。 我們不能只是簡單地使用類型轉換。

例如:-

int s;
char i= '2';
s = (int) i;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM