在 C# 中如何将字符串转换为长整型数据?

143

我该如何在C#中将数据从字符串转换为长整型?

我有数据

String strValue[i] ="1100.25";

现在我想要它里面

long l1;

1
Longs代表整数。您提供了一个非整数。您想对此做什么? - Jon Skeet
1
如果strValue是"1100.75"怎么办?请参见:https://dev59.com/_3RB5IYBdhLWcg3wZmhz - magma
@magma:如果你将它转换成十进制数,那么它会四舍五入,比如这种情况下,如果给定的数字是1100.75,则输出为1101。 - love Computer science
1
@charlie,我只是提出这个问题,因为MayP似乎没有完全意识到这里的含义。他可能只想摆脱非整数部分而不进行任何舍入,如果这确实是他想要的,那就没问题了。谢谢。 - magma
8个回答

66

如果您想获取该数字的整数部分,必须先将其转换为浮点数,然后强制转换为长整型。

long l1 = (long)Convert.ToDouble("1100.25");

您可以使用 Math 类来按照您想要的方式四舍五入或向上取整数字,或者只是截断...


如果你在指定的输入上运行这个程序,它会给你一个“FormatException”。 - Andrew Savinykh
1
@zespri,不,至少在大多数文化中不会……但是在小数点分隔符不是“.”的文化中确实会失败。 - Thomas Levesque
使用您的代码,这个值2037104000005652013被更改为2037104000005651968。 - Pranesh Janarthanan
1
你需要指定一个明确的文化,将 . 视为十进制分隔符(CultureInfo.InvariantCulture 可以工作)。 - Etienne de Martel
1
@PraneshJanarthanan double 可以安全表示的最大整数是 2^53,而你的整数比它还要大,所以当转换为 long 时会得到一些奇怪的结果。 - Etienne de Martel

54

您还可以使用long.TryParselong.Parse

long l1;
l1 = long.Parse("1100.25");
//or
long.TryParse("1100.25", out l1);

21

14
long l1 = Convert.ToInt64(strValue);

那应该可以了。


不建议与linq一起使用。它会给我一个异常。long.Parse("1100.25") 对我有用。 - César León

7

由于存在小数点,您无法直接将其转换为长整型。我认为您应该先将其转换为十进制,然后再将其转换为长整型,类似于以下代码:

String strValue[i] = "1100.25";
long l1 = Convert.ToInt64(Convert.ToDecimal(strValue));

希望这可以帮助你!

3

long在内部表示为System.Int64,它是一个64位有符号整数。

你输入的值"1100.25"实际上是十进制数而不是整数,因此无法转换为long。

你可以使用:

String strValue = "1100.25";
decimal lValue = Convert.ToDecimal(strValue);

将其转换为十进制值


1

您也可以使用 Int64.TryParse 方法。如果有任何字符串值但未生成错误,则它将返回“0”。

Int64 l1;

Int64.TryParse(strValue, out l1);

-2

您可以创建自己的转换函数:

    static long ToLong(string lNumber)
    {
        if (string.IsNullOrEmpty(lNumber))
            throw new Exception("Not a number!");
        char[] chars = lNumber.ToCharArray();
        long result = 0;
        bool isNegative = lNumber[0] == '-';
        if (isNegative && lNumber.Length == 1)
            throw new Exception("- Is not a number!");

        for (int i = (isNegative ? 1:0); i < lNumber.Length; i++)
        {
            if (!Char.IsDigit(chars[i]))
            {
                if (chars[i] == '.' && i < lNumber.Length - 1 && Char.IsDigit(chars[i+1]))
                {
                    var firstDigit = chars[i + 1] - 48;
                    return (isNegative ? -1L:1L) * (result + ((firstDigit < 5) ? 0L : 1L));    
                }
                throw new InvalidCastException($" {lNumber} is not a valid number!");
            }
            result = result * 10 + ((long)chars[i] - 48L);
        }
        return (isNegative ? -1L:1L) * result;
    }

它可以进一步改进:

  • 在性能方面
  • 使验证更严格,即当前不关心第一个小数点后的字符是否为数字
  • 将舍入行为指定为转换函数的参数。当前进行四舍五入

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