将字符串十进制转换为整数

42

我有一个字符串 "246246.246",我想将其传递给IConvertable接口的ToInt16、ToInt32、ToInt64方法。如何将带有小数点的字符串解析为整数?

这是一种解决方案,但是否有更好的解决方案?

string value = "34690.42724";
Convert.ToInt64(Convert.ToDouble(value));

你是否关心舍入或仅仅是修剪小数部分? - Joel Etherton
3
在将字符串转换为数字时,始终使用CultureInfo。 - xsl
四舍五入到最接近的整数即可。大多数情况下,它将是像99.99999999999这样的东西,我想要四舍五入到100。 - Mike
5个回答

78

要进行折扣舍入,可以这样做:

Convert.ToInt64(Math.Floor(Convert.ToDouble(value)));

如果你需要四舍五入,则可以将Math.Floor替换为Math.Round

编辑:因为你在评论中提到了你会进行四舍五入:

Convert.ToInt64(Math.Round(Convert.ToDouble(value)));
如果您需要考虑本地化/全球化,那么如@xls所说,您应该在转换中应用CultureInfo。 编辑2:使用字符串函数的替代方法(在我看来不太优雅 - 也许可以使用谓词函数使其更优雅):
Convert.ToInt64(value.Substring(0, value.IndexOf('.') > 0 ? value.IndexOf('.') : value.Length));

1
听起来好像没有特别的方法来做这件事。你只需要先进行Covnert(),然后再进行一次Convert()即可。 - Mike
2
@Mike - 有时候两点之间最短的距离是一条直线。在某个层面上,你必须进行转换。你可以使用一些字符串函数来缩短它。 - Joel Etherton
2
你不应该对值进行四舍五入,因为ToInt64(double)已经返回了四舍五入后的版本。 - deepee1
转换的包是什么?我应该导入什么? - vaibhavcool20
@vaibhavcool20:它在System命名空间中。使用using System;应该可以解决问题。 - Joel Etherton

16

你不需要对值进行四舍五入,因为ToInt64(double)已经返回了四舍五入的版本。

        string value = "246246.246";
        Convert.ToInt64(Convert.ToDouble(value));

1
它无法正确四舍五入,即23.5将变成“ 23”而不是“ 24”。 - Theodosius Von Richthofen
根据微软文档和快速测试,@TheodosiusVonRichthofen的Convert.ToInt64(Convert.ToDouble("15.5"))返回16。它进行四舍五入而不是截断。 - deepee1

2

如果您真的关心准确性而不是速度,那么十进制类型会更好。

(long)Math.Round(decimal.Parse(value));

0
假设这个字符串来自用户输入,你可能想要捕获数字格式。可以通过一个可重复使用的函数运行它,如下所示...
int? ConvertToNumber(string value)
{
   if (value == string.Empty) return null;

   try
   {
       var dec = decimal.Parse(value,
           NumberStyles.AllowDecimalPoint |
           NumberStyles.Number |
           NumberStyles.AllowThousands);

       return (int)Math.Round(dec);
   }
   catch (Exception ex)
   {
       Console.WriteLine("Please input a number.");
       return null;
   }
}

0
以下代码用于将十进制金额转换为Kobo值,这在集成到需要以kobo或美分表示金额的支付网关时是必需的。
public static void Main(string[] args)
{          
  decimal amount = 50.567890m; 
        
  int koboValue = 0;
        
  String[] values =  amount.ToString("0.##").Split('.');
        
  int wholeNumber = Convert.ToInt32(values[0]);
        
  if(values.Count() > 1){
        koboValue = Convert.ToInt32(string.Join(string.Empty,values));
  }else{
        koboValue = wholeNumber * 100;
  }
        
  Console.WriteLine(koboValue);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接