为什么在转换后不需要后缀,但在声明过程中需要后缀呢?

时间:2019-06-09 05:32:15

标签: c# type-conversion

使用C#从字符串转换为浮点数时,浮点数不接受后缀f。我想将字符串转换为float,并且我的字符串中已经包含“ F”后缀。但是从字符串转换为float时,float不接受后缀f并引发异常。

static void Main()
{
    string any_str = "123.45F";
    float f = float.Parse(any_str);       
    Console.WriteLine(f);
    Console.ReadLine();
}

4 个答案:

答案 0 :(得分:4)

基本上float.Parse使用后缀f不能执行任何操作。 float.Parse将只接受代表数字值的字符串,任何多余的非数字字符都将引发异常。 f后缀仅供您在代码本身中使用。因此,正如fahimeNorse所说的那样,您需要在使用float.Parse之前摆脱掉那个'f'。

答案 1 :(得分:1)

我认为float.Parse并没有任何内置功能,但是您可以为自己的方便创建扩展方法。

public static float ToFloat(this string value)
{
    return float.Parse(value.TrimEnd('f', 'F'));
}

使用方式

any_str.ToFloat();

编辑:有人可能建议您使用Regex清除所有字母或符号,但是效果不佳;仅当您知道末尾会有fF以外的符号时,才使用它。

答案 2 :(得分:1)

  

为什么在转换后我们不需要后缀,但是在声明期间我们   需要吗?

默认情况下,根据C#规范,每个数字都有一个floating point将被视为Double变量,因此您需要使用F后缀来为此类型创建文字。

// 3.14 is considered a double variable by the compiler so it gives you an error
float myFloat = 3.14; 

您可能会问为什么不能分配值为3.14的双精度变量或将其强制转换为浮点变量?

http://net-informations.com/q/faq/float.html

  

Decimal,Double和Float变量类型在方式上有所不同   他们存储值。精度是主要区别   float是单精度(32位)浮点数据类型,双精度   是双精度(64位)浮点数据类型,十进制是   一个128位浮点数据类型。

     

浮点数-32位(7位数字)双精度位-64位(15-16位)   主要区别是Floats和Doubles是二进制浮点   类型和小数点会将值存储为浮点小数点   类型。因此,小数位数具有更高的精度,通常用于   在高度要求的货币(金融)应用程序中   准确性。但是在性能方面,小数要慢于两倍和   浮动类型。

You can read this answer as well.

关于Parse方法:

float.Parse仅需要一个有效的字符串,这意味着仅包含[0-9,符号字符和小数点的字符串(因区域性而异,例如[,/.])。

因此,您只需要删除字符串中所有无效的字符,然后对其进行解析即可。

答案 3 :(得分:-1)

您需要删除输入中的所有字母字符:

public static void Main()
{
    string any_str = "123.45F";
    string numberOnly = Regex.Replace(any_str, "[^0-9.]", "");
    float f = float.Parse(numberOnly);       
    Console.WriteLine(f);
    Console.ReadLine();
}