将包含浮点数的字符串转换为整数的C#方法

18

如何将一个可能为空或包含 "1.2" 等内容的字符串转换为整数?int.TryParse 无法成功,我也不想使用 float.TryParse 再转换为 int


4
将其解析为浮点数并四舍五入后,我不知道你怎么能做到这一点... - Philippe
1
(int)float.Parse("1.2") - 这不是太麻烦。Ruby 可以这样做 - "1.234".to_i 得到 1。 - Gishu
1
@Gishu... VB6可以使用Int("1.234")得到1。但是问题是关于C#的。 - MarkJ
@MarkJ - 嗯,我也注意到了...这就是为什么我刚刚给Phillipe点了赞..在C#中,解析和转换似乎是做这个的方法。与下面的答案相比,所有这些答案都需要更多的工作。 - Gishu
@MarkJ:FYI,VB.NET也接受这种语法,但是例如Int(1.000000)返回的整数结果为1000000(可能与我的国家使用,作为默认分隔符有关,但仍值得注意)。编辑:Convert.ToDouble也是如此,因此这只是与Culture-NumberFormat有关的问题... - Levite
7个回答

41
解决方案1:Convert.ToDouble(依赖于区域设置)
您可以使用Convert.ToDouble。但是,请注意!下面的解决方案仅在当前区域设置中的数字分隔符为句点字符时有效。
var a = (int)Convert.ToDouble("1.2");    

解决方案2:Convert.ToDouble(与文化无关)
最好使用IFormatProvider并以与当前文化设置无关的方式转换数字。
var a = (int)Convert.ToDouble("1.2", CultureInfo.InvariantCulture.NumberFormat); 

解决方案3:解析和拆分
另一种完成这个任务的方法是在解析后的字符串上使用拆分(Split)函数:
var a = int.Parse("1.2".Split('.')[0]);

或者:

var a = int.Parse("1.2".Split('.').First());

笔记


2
+1. 特别是要说Convert.ToDouble使用线程区域设置中的十进制分隔符(默认为Windows区域设置),它可以是逗号。您可以通过传递CultureInfo.InvariantCulture.NumberFormat来强制使用点。 - MarkJ

5

我不知道将其解析为float并转换为int有什么问题。我怀疑其他任何方法都不会更有效,但这里是一次尝试:

//allows empty strings and floating point values
int ParseInt(string s, bool alwaysRoundDown = false)
 {
    //converts null/empty strings to zero
    if (string.IsNullOrEmpty(s)) return 0;

    if (!s.Contains(".")) return int.Parse(s);

    string parts = s.Split(".");
    int i = int.Parse(parts[0]);
    if (alwaysRoundDown || parts.Length==1) return i;

    int digitAfterPoint = int.Parse(parts[1][0]);
    return (digitAfterPoint < 5) ? i : i+1;
 }

为了全球化代码,您需要将"."替换为System.Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator

不要忘记,小数分隔符可能因区域设置而异。 - MarkJ
我添加了一条关于全球化的注释。谢谢! - Mark Cidade
毫无疑问,@Mark是最好的。我给他点赞。 - Kangkan

2
int a = (int)Math.Round(float.Parse("0.9"));

如果你不想让0.9f转换为0而不是1,你需要先进行四舍五入。


1
也许你可以尝试使用字符串函数删除浮点数后面的所有内容,然后转换为整数。但是说实话,我认为这种方法不如先将其转换为浮点数,再转换为整数。

如果您这样做,请不要忘记十进制分隔符在不同的区域设置中是不同的。我们的法国表亲使用“,”。 - MarkJ
当然,我觉得这很明显 :) 在俄罗斯,我们也使用逗号。 - fuwaneko

0

我认为另一种方法是将字符串分割成多个部分,以小数点(.)作为分隔符,然后解析整数。当然,我还没有问过您是否可能包含类似于"37.56 miles in 32.65 seconds"类型的值。

考虑到字符串中只会有一个值(字符串或数字),我可以想到以下内容:

public int64 GetInt64(string input)
{
    if (string.IsNullOrEmpty(input)) return 0;
    // Split string on decimal (.)
    // ... This will separate all the digits.
    //
    string[] words = input.Split('.');
    return int.Parse(words[0]);
}

当进行int32解析时,可能不需要int64返回。 - btlog

0

你可以使用Visual Basic运行库从C#中实现这个功能。

你需要向你的解决方案添加对程序集Microsoft.VisualBasic.dll的引用。

然后,以下代码将完成你的转换:

using VB = Microsoft.VisualBasic.CompilerServices;

class Program
{
    static void Main(string[] args)
    {
        int i = VB.Conversions.ToInteger("1.2");
    }
}

0

我曾经遇到过同样的问题,最终采用了Mark和Dariusz的混合方法:

 if (num == "")
     {
      num = "0.00";
     }

  var num1 = (float)Convert.ToDouble(num);

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