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

C# C将包含浮点的字符串转换为整数,c#,parsing,floating-point,int,C#,Parsing,Floating Point,Int,以空字符串或包含1.2的字符串为例,将其转换为整数的最佳方法是什么?当然,int.TryParse会失败,我不想使用float.TryParse然后转换为int。也许您可以尝试使用字符串函数删除浮点后的所有内容,然后再转换为int。但说真的,我认为这并不比先转换为float,然后再转换为int好。解决方案1:转换为双文化相关 您可以使用Convert.ToDouble。但是,当心!仅当当前区域性设置中的数字分隔符为句点字符时,以下解决方案才有效 var a = (int)Convert.ToDo

以空字符串或包含1.2的字符串为例,将其转换为整数的最佳方法是什么?当然,int.TryParse会失败,我不想使用float.TryParse然后转换为int。

也许您可以尝试使用字符串函数删除浮点后的所有内容,然后再转换为int。但说真的,我认为这并不比先转换为float,然后再转换为int好。

解决方案1:转换为双文化相关 您可以使用Convert.ToDouble。但是,当心!仅当当前区域性设置中的数字分隔符为句点字符时,以下解决方案才有效

var a = (int)Convert.ToDouble("1.2");    
解决方案2:Convert.ToDouble独立于区域性 最好以独立的方式使用和转换当前区域性设置中的数字:

var a = (int)Convert.ToDouble("1.2", CultureInfo.InvariantCulture.NumberFormat); 
解决方案3:解析和拆分 完成此任务的另一种方法是对已解析的字符串使用拆分:

var a = int.Parse("1.2".Split('.')[0]);
或:

笔记 如果要处理空字符串和空字符串,请编写一个方法并添加字符串。条件 要获取当前区域性设置的小数分隔符,可以使用属性。 你也应该注意避免。 明智地选择casting、Parse、TryParse或class。更多信息请访问:
我不知道解析为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;
 }

为了使代码全球化,您需要替换代码。使用。

我认为另一种方法是将字符串拆分成小数点。作为分隔符,然后对整数进行解析。当然,我还没有问您字符串是否可能包含像32.65秒37.56英里这样的值类型值

考虑到字符串中只有一个值字符串或数字,我可以在下面的行中想到一些东西:

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]);
}

除非希望将0.9f转换为0而不是1,否则需要先对其进行四舍五入。

您可以使用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");
    }
}

我也有同样的问题,最后使用了马克和达里乌兹的混合体:

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

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

Appart将其解析为一个float,然后对其进行涂脂抹粉,我不知道您如何做到这一点……intfloat.Parse1.2-这不是太多的工作。不过Ruby做到了这一点-1.234.to_i1@Gishu ... VB6就是这样做的,Int1.234得到1。但问题是关于C@MarkJ-是的,我注意到。。这就是为什么我投了菲利普一票。。在C语言中,解析和强制转换似乎是一种方法。相比之下,下面的答案似乎要复杂得多。@MarkJ:FYI VB.NET也接受这种语法,但例如Int1.000000返回1000000,因为整数结果可能与以下事实有关:在我的国家,它是默认的分隔符,但仍然值得注意。编辑:Convert.ToDouble也有相同的功能,因此这只是区域性数字格式的问题…在执行int32解析时,可能不需要int64返回。如果这样做,请不要忘记,十进制分隔符在不同的区域设置中是不同的。当然,我们的法国表亲使用逗号,我认为这是显而易见的:在俄罗斯,我们也使用逗号。别忘了十进制分隔符可以根据地区设置而有所不同。我补充了一条关于全球化的注释。谢谢“毫无疑问是最好的,”马克说+我这边一个。特别是Convert.ToDouble默认使用线程区域性设置和Windows区域设置中的十进制分隔符,它可以是逗号。通过传递CultureInfo.InvariantCulture.NumberFormat,可以强制它使用点
using VB = Microsoft.VisualBasic.CompilerServices;

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

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