【问题标题】:How do i convert a floating point string to an int in c#如何在c#中将浮点字符串转换为int
【发布时间】:2010-09-01 09:32:44
【问题描述】:

我有一个字符串:

字符串测试 = "19,95";

我不想将其转换为 int。

我使用:

int num = Convert.Int32(test);

但是它会引发 FormatException。并告诉我该字符串不是适合转换的字符串。

我的猜测是它与小数分隔符有关。

我该如何解决这个问题?

【问题讨论】:

  • 整数应该是20还是19?
  • Convert String to Integer 的可能重复项
  • 你能提供更多关于本地化的信息吗?将输入始终以逗号作为小数分隔符,或者可以是句号/逗号的混合作为分隔符。您还知道代码运行的本地化 - 这与输入有关吗?
  • 预计 int 为 20。这对我来说是合乎逻辑的结果。我在丹麦 Windows 7 上。逗号总是用作小数分隔符。

标签: c# string globalization culture


【解决方案1】:
using System.Globalization;
...
NumberFormatInfo nfi = new NumberFormatInfo();
nfi.NumberDecimalSeparator = ",";
double num = Convert.ToDouble(test, (IFormatProvider)nfi);

测试和工作。

为了完整性:

int applesApplesApples = Math.Ceiling(num);
int bananaBananaBanana = (int)num;
int cucumberCucumberCucumber = Math.Floor(num);

[更新]

正如 Rushyo 在下面我的 cmets 中正确指出的那样,此示例是人为设计的,最佳实践方法是确定您正在使用哪种文化,以便获得正确的 CultureInfo 对象来工作.

然后,您可以在进行所有数字格式设置时使用来自该特定 CultureInfo 的本地化 NumberFormatInfo。

【讨论】:

  • 你为什么想要一个 int.. 如果你只是将他们的 19,95 美元四舍五入到 20 美元并且没有给他们 5c 的零钱,他们会觉得真的被敲诈了。我有一种轻微的感觉,OP 可能把他的类型弄糊涂了。无论如何,如果他真的想要一个 int,我将把它留给 OP 来解决下一个问题。
  • 我不想要 int。我现在的工作解决方案是使用 split 删除逗号及其后面的所有内容。然后转换工作。然而,这也会导致数字向下舍入,我想要适当的向上或向下舍入。
  • 酷,像上面那样做(先转换成双精度)然后使用: int intVal = (int)doubleVal;让自己的 int 四舍五入到最接近的整数。
  • 使用 Math.Round。更加一致(将结果转换为 int)
  • 注意:真的不喜欢这个解决方案。 .NET 具有出色的本地化功能。利用丹麦文化信息将为您省去很多麻烦。课程在那里。使用它们!
【解决方案2】:
string dblText = "19,95";
CultureInfo ci = new CultureInfo ("en-US", true);
ci.NumberFormat.NumberDecimalSeparator = ",";
double dblValue = double.Parse (dblText, NumberStyles.AllowDecimalPoint, ci);

如果需要 19(去掉小数部分):

int intValue = (int)dblValue;

如果需要 20(数学四舍五入):

int intValue = (int)(dblValue + 0.5);

【讨论】:

  • 如果本地化错误,这仍然会失败。该字符串有一个逗号分隔符 - 可能表示欧洲原产地。如果您使用英国或美国本地化设置运行此程序,它将失败,因为它希望将句号作为分隔符。逗号是英国/美国的千位分隔符
  • 只是给正在阅读的任何人的提示:此答案已被编辑。问题:为什么要创造一种新文化,它是 en-US 的变体?那只是弄乱了语义。 'da' 或 'da-DK' 似乎更合适——而且不需要你创造一种全新的文化!
  • 这只是提出这个想法的一个快速解决方案。我更喜欢氢气的解决方案。
【解决方案3】:

您希望从"19,95" 得到什么整数? 1995 年? 19? 20?

也许您应该先将数字转换为双精度数,然后在对您的应用程序有意义的任何方向进行舍入或截断。

【讨论】:

    【解决方案4】:

    正如其他人已经提到的那样,您问题的主要问题是,您没有提供任何有关您期望的结果的信息,并且有些人还提出了文化问题(小数分隔符,千位分隔符)。所以我做一点总结:

    private int Parse(string text)
    {
        Decimal value;
    
        //Select the culture you like to use
        var culture = CultureInfo.CurrentCulture;
        //var culture = CultureInfo.GetCultureInfo("en-US");
        //var culture = CultureInfo.GetCultureInfo("de-DE");
    
        if (Decimal.TryParse(text, NumberStyles.Number, culture, out value))
        {
            //Throw away the fractional part
            //return (int)value;
    
            //or make some rounding??
            return (int)Math.Round(value, MidpointRounding.ToEven);
        }
    
        //What should happen if the parsing fails??
        //Return some default value
        return int.MinValue;
        //return 0;
    
        //Or throw an exception?
        //throw new FormatException();
        //In that case, maybe use directly Decimal.Parse and let this
        //function throw the exception with the correct message.
    }
    

    【讨论】:

      【解决方案5】:

      你确定要它是一个 int 吗?

      这个数字是双倍的。

      int num = (int)double.Parse(test); //will be 19
      
      double num = double.Parse(test); //wil be 19.95
      

      【讨论】:

      • 当你可以做 double.Parse 时,为什么要将 int.Parse 转换为 double 值?
      • 小数分隔符必须是.
      • 谁说的?许多使用 , 的国家/地区会不同意。
      猜你喜欢
      • 2021-09-10
      • 2014-01-16
      • 2012-06-27
      • 1970-01-01
      • 1970-01-01
      • 2011-11-25
      • 1970-01-01
      • 2011-03-12
      相关资源
      最近更新 更多