我有一個二進制串,由用戶,我需要轉換爲整數輸入。二進制字符串到整數
起初我naivly使用這個簡單的行:
Convert.ToInt32("11011",2);
不幸的是,如果用戶直接入射到整數這個拋出異常。
Convert.ToInt32("123",2); // throws Exception
如何確保用戶輸入的字符串實際上是二進制字符串?
- try..catch ....但這太難看了。
- 像 'Int32.TryParse' 也許。
感謝
我有一個二進制串,由用戶,我需要轉換爲整數輸入。二進制字符串到整數
起初我naivly使用這個簡單的行:
Convert.ToInt32("11011",2);
不幸的是,如果用戶直接入射到整數這個拋出異常。
Convert.ToInt32("123",2); // throws Exception
如何確保用戶輸入的字符串實際上是二進制字符串?
感謝
你可以使用一個Regex
來檢查,這是 「^ [01] + $」(或更好, 「^ [01] {1,32} $」),並然後使用Convert
?
,例外是不可能是一個巨大的問題呢!不雅?也許。但他們工作。
例(格式化的垂直空間):
static readonly Regex binary = new Regex("^[01]{1,32}$", RegexOptions.Compiled);
static void Main() {
Test("");
Test("01101");
Test("123");
Test("0110101101010110101010101010001010100011010100101010");
}
static void Test(string s) {
if (binary.IsMatch(s)) {
Console.WriteLine(Convert.ToInt32(s, 2));
} else {
Console.WriteLine("invalid: " + s);
}
}
這並不正確處理Convert.ToString的轉化率((長)Int32.MaxValue + 1,2)。這應該被拒絕,但被錯誤地轉換爲Int32.MinValue。 – 2009-08-13 12:32:54
爲什麼要被拒絕?它是一個有效的32位二進制值。如果你選擇將它解釋爲int32,那麼肯定:任何帶有msb集合的東西都將是負數......並且? – 2009-08-13 12:38:45
感謝偉大的解決方案。我真的去了。但要求改變了一些,所以我決定嘗試 - 抓住是最簡單和最乾淨的解決方案 – eric 2009-08-14 05:54:01
感謝偉大的和令人難以置信的快速的答案!
Unfortunaetly我的要求改變。現在用戶幾乎可以輸入任何格式。二進制,十進制,十六進制。所以我決定try-catch只是提供最簡單和最乾淨的解決方案。
所以只是爲了好措施我張貼我現在使用的代碼。我認爲這很清楚,甚至有點優雅,所以我認爲^^。
switch (format)
{
case VariableFormat.Binary:
try
{
result = Convert.ToInt64(value, 2)
}
catch
{
// error handling
}
break;
case VariableFormat.Decimal:
try
{
result = Convert.ToInt64(value, 10)
}
catch
{
// error handling
}
break;
case VariableFormat.Hexadecimal:
try
{
result = Convert.ToInt64(value, 16)
}
catch
{
// error handling
}
break;
}
所以感謝你鼓勵我使用try - 趕上,我認爲它確實提高了我的代碼的可讀性。
謝謝
用戶如何輸入字符串?如果它是一種形式,你能不能限制它只接受'0'和'1'? – outis 2009-08-13 12:19:18
爲什麼'try' - 'catch'「醜」? – RaYell 2009-08-13 12:25:57
你可能是對的,它並不那麼難看。我現在實際上也是這樣,因爲十六進制值可能會突然出現。所以一些簡單的嘗試就是最簡單和最簡單的解決方案。謝謝大家。 – eric 2009-08-14 05:52:38