【问题标题】:Convert string to int then multiply another int将字符串转换为 int 然后乘以另一个 int
【发布时间】:2013-04-17 00:57:12
【问题描述】:

我正在使用其他人的代码,但我一点也不擅长 C#!

我需要将total1total2 相乘。下面的代码给了我answer = 0,这是不对的。这里有什么问题?!此外,total1 的值作为 int 保存在 MS SQL 数据库中,如果这很重要的话。当我在最后一行设置断点时,我注意到它的读数 total29total1"15"(带引号)。

System.Data.OleDb.OleDbConnection pcn;
System.Data.OleDb.OleDbCommand pcm;
System.Data.OleDb.OleDbDataReader prs;
pcn = new System.Data.OleDb.OleDbConnection("");
pcm = new System.Data.OleDb.OleDbCommand();
pcn.Open();
pcm.Connection = pcn;
var tableSql = String.Format(@"select sum(TicSold) as total1 from BusTickets where TicketType = '9'");
pcm.CommandText = tableSql;
prs = pcm.ExecuteReader();
var rowcount = 0;
while (prs.Read())
{
    rowcount++;
    total1 = prs["total1"].ToString();
}
prs.Close();
pcn.Close();

int total2 = 9;
int answer = total2 * Convert.ToInt32(total1);

更新:通过使用下面贾斯汀的方法,我能够得到答案以显示正确的数字而不是 0,但现在我想在 .aspx 页面上显示“答案”。以前,我会将其公开(public int answer),然后在我的 html 中放入 以显示金额。但它仍然显示0。上面的代码是我的代码,下面的代码是我的主页。再次抱歉,我正在学习这方面的知识。

Total Ticket Profit: <strong><%= answer %></strong></p>
        </div> 

【问题讨论】:

  • 你能从数据库中获取信息作为整数,而不是将其转换为字符串然后再返回吗? total1 = prs["total1"] 本身是否有效?
  • 你调试过你的代码吗?你在 total1 变量中得到什么值
  • 你能在调试时检查它的值吗?那我还建议使用Int32.TryParse 方法而不是使用Convert.ToInt32
  • 在第二次尝试中,您只能得到 1) int.Parse 的异常 2) total3 的结果。除非 total3 或 total2 为 0,否则你怎么能得到 0?你说total2是9,所以如果total3是15你只能得到135。
  • 所以在下一行执行后答案将是 135,对吧?该行执行后的答案是什么?

标签: c# asp.net string int


【解决方案1】:

该值应该已经是来自数据库的整数,因此,在读取该值时,您应该只需要转换该值:

int total1 = (int)prs["total1"];

【讨论】:

  • 执行此操作时我仍然得到 answer = 0 。现在唯一改变的是在调试期间 total1 = 15 而不是“15”。
  • 我的断点在错误的位置,你是对的,这解决了等式。仍在努力在我的首页上显示数字。
【解决方案2】:

查看Convert.ToInt32帮助页面有返回值显示:

Type: System.Int32
A 32-bit signed integer that is equivalent to the number in value, or 0 (zero) if value is null.

因此,作为 total1 的值的“15”必须从 Convert 方法返回 0,从而在乘法后得到总和为零 (0)。

我会推荐使用

int answer = 0;
int myTotal = 0;

if(int.TryParse(total1, System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.CurrentCulture,out myTotal))
{
     answer = myTotal * total2;
}

更新

您更新后的问题看起来可以通过查看this post 来回答。它将变量定义为公共属性,然后以类似于您的方式调用它&lt;%=answer%&gt;

public string Answer { get { return answer.ToString(); } }

或返回您正在显示的计算答案的方法的结果(假设其返回值为答案)。

【讨论】:

  • 当我使用你的代码时,我得到一个错误“namespace system.globalization no overload for method parse requires 4 arguments”
  • 我的错误。那应该是 TryParse。我会解决的
【解决方案3】:

除了其他人已经在 cmets 中对您的原始问题提出的问题外,我建议您改为查看 ExecuteScalar 方法,因为当只有一个结果时,您实际上并不需要遍历记录集回来。

但是,要回答您的问题,total2 来自哪里?变量total1 本身肯定会返回一个字符串,因为当您设置它时,您会将数据库结果转换为字符串。 (这个变量在哪里声明?例如,string total1?)尝试改为使用int total1,然后在得到结果时使用total1 = Convert.ToInt32(prs["total1"]);。我希望这对您有所帮助并祝您好运!

【讨论】:

  • total2 总是 9。这只是门票的成本,我要做的是找出数据库中有多少张门票,然后将门票的总和乘以 9。
  • TicSold 列中是否有空值? Convert.ToInt32 会将其更改为零?
  • 列中没有空值现在只有两条记录,一条值为2,一条值为4。
  • 请尝试将 total1 声明为 int,并丢失所有字符串/ToString 杂物,然后看看是否得到更有意义的错误?
  • @kcray 在将结果分配给answer 变量之前,您已经崩溃了。在大括号上打断,然后将鼠标悬停在 answer 上,或者尝试将鼠标悬停在当前断点上的 * 符号上。
【解决方案4】:

total1 ISNULL ?

int iTotal1 = answer  = 0;
if(int.TryParse(total1,out iTotal1 ))
{
     answer = total2 * Convert.ToInt32(total1);
}else{
    // total1 Not Int
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-10
    • 1970-01-01
    • 1970-01-01
    • 2017-06-30
    • 2015-10-13
    • 2011-10-02
    相关资源
    最近更新 更多