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

Nir*_*Nir 16 c# floating-point int parsing

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

Dar*_*iak 36

解决方案1 ​​:( Convert.ToDouble取决于文化)

你可以用Convert.ToDouble.但是,要小心!仅当当前区域性设置中的数字分隔符是句点字符时,以下解决方案才有效.

var a = (int)Convert.ToDouble("1.2");    
Run Code Online (Sandbox Code Playgroud)

解决方案2 :(与Convert.ToDouble文化无关)

最好IFormatProvider从当前文化设置中以独立方式使用和转换数字:

var a = (int)Convert.ToDouble("1.2", CultureInfo.InvariantCulture.NumberFormat); 
Run Code Online (Sandbox Code Playgroud)

解决方案3:解析和拆分

完成此任务的另一种方法是在解析后的字符串上使用Split:

var a = int.Parse("1.2".Split('.')[0]);
Run Code Online (Sandbox Code Playgroud)

要么:

var a = int.Parse("1.2".Split('.').First());
Run Code Online (Sandbox Code Playgroud)

笔记

  • +1.特别是说`Convert.ToDouble`使用线程文化设置中的小数分隔符(默认情况下是Windows区域设置),它可以是逗号.您可以通过传递`CultureInfo.InvariantCulture.NumberFormat`强制它使用点 (2认同)

Mar*_*ade 5

我不知道解析为 afloat并转换为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;
 }
Run Code Online (Sandbox Code Playgroud)

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