簡體   English   中英

C#將字符串“ 0”解析為整數

[英]C# parse string “0” to integer

我有一台新的筆記本電腦正在工作,而本周早些時候可用的代碼今天無法使用。

以前工作的代碼已簡化:

while (dr.Read())
{
    int i = int.Parse(dr.GetString(1))
}

現在,當數據庫值為0時,它將失敗。有時,但不能可靠地,它將代替:

while (dr.Read())
{
    int i = Convert.ToInt32(dr["FieldName"]))
}

我想念一些愚蠢的東西嗎?

奇怪的是,ReSharper還出現了許多奇怪的錯誤,並帶有與上述代碼相同的錯誤消息:“輸入字符串的格式不正確。” (在加載項目之前就開始。)

有任何想法嗎? 有人有SP問題嗎? 買機器時,我確實嘗試確保所有SP都是最新的。

編輯:我知道如何使用Try.Parse和錯誤處理。 此處的代碼已簡化。 我正在從數據庫表中讀取測試用例。 該列只有0、1和2個值。 我已經確認了。 我將數據庫字段放入字符串變量s中,然后嘗試使用int.Parse(s)。 該代碼在本周早些時候有效,數據庫未更改。 唯一改變的是我的環境。

為了完全簡化問題,此行代碼引發異常(“輸入字符串的格式不正確”):

 int.Parse("0");

編輯:感謝大家幫助我解決了這個問題! 解決方案是強制重置我的語言設置。

可能的解釋

基本上,問題在於HKEY_CURRENT_USER \\ Control Panel \\ International下的sPositiveSign值設置為0,這意味着正號為'0'。 因此,在解析“正號0”時,將其截斷,然后將字符串的其余部分(“”)解析為數字,這當然是行不通的。 這也解釋了為什么int.Parse(“ 00”)不是問題。 盡管無法通過“控制面板”將正號設置為“ 0”,但是仍然可以通過注冊表進行設置,從而導致問題。 不知道帖子中用戶的計算機是如何以這種錯誤的設置結束的...

更好的是,您的計算機上的輸出是什么:

Console.WriteLine(System.Globalization.NumberFormatInfo.GetInstance(null).PositiveSign);

我敢打賭,當我的打印出一個+號時,您的打印出0 ...。

我建議您檢查“ Control Panel > Regional and Language Options設置...如果它們顯示正常,請嘗試將其更改為不同於您使用的任何語言的其他語言(我假設是英語)。

我認為調用Convert.ToInt32以從數據庫中讀取值通常不是一個好主意,該值是null,該值不能解析。 您在這里有任何異常處理代碼嗎?

  1. 確保該值不為空。
  2. 在調用Int32.Parse之前檢查值是否可以解析。 考慮Int32.TryParse。
  3. 考慮使用像int這樣的可為空的類型? 在這種情況下。

HTH。

您確定它是“ 0”而不是“ null”嗎? 你有什么例外?

編輯:

出於好奇,如果確實是int.Parse(“ 0”)的問題,您可以嘗試int.Parse(“ 0”,CultureInfo.InvariantCulture);嗎?

否則,發布您的查詢。 有參加嗎?

編輯:
@Mike的回應讓我認為這是極其奇怪的行為,一個簡單的Google搜索就產生了以下結果: int.Parse奇怪的行為

空字符串也將導致此問題。

您可以在解析之前檢查dbnull,這也是驗證解析數據的好方法。

您可以使用默認值和TryParse。

int i = -1;
if(!int.TryParse(dr["MyColumn"] as string, out i))
   //Uh Oh!

編輯:
我在@Chris的答案中將其發布為注釋,但是如果sql數據類型為int,為什么不直接在DataReater上使用GetInt32方法而不是將其作為字符串檢索並手動解析呢?

您應該檢查dr [“ FieldName”]!= DBNull.Value,並且如果它通過DBNull測試,則應該使用TryParse。

if ( dr["FieldName"] != DBNull.Value )
{
    int val = 0;
    if ( int.TryParse( dr["FieldName"], out val ) )
    {
        i = val;
    }
    else
    {
        i = 0; // or some default value
    }
}

我已經看到.NET Double類也出現了此問題,它也從字符串“ 0”進行解析。

這是真正令人毛骨悚然的部分:您可以通過使用其他用戶帳戶運行程序來解決問題,並且有時,如果您在計算機上銷毀並重新創建了當前用戶帳戶,它將可以正常運行。

我還沒有找到答案,但是您至少可以這樣解決。

這是離開左側字段的方法,但是請檢查您的本地化設置。 將網站移至加拿大服務器時,出現了許多“輸入字符串格式不正確”的信息。 問題出在DateTime.Parse方法中,通過將區域性設置為“ en-US”得以解決。

是的,您的情況有所不同-但是,您永遠不會知道。

您要檢查null嗎?

if(!dr.IsNull("FieldName")){
   int i = Convert.ToInt32(dr["FieldName"]))
}

暫無
暫無

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

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