C#でデータを文字列からlongに変換する方法


101

C#でデータを文字列からlongに変換するにはどうすればよいですか?

データがあります

String strValue[i] ="1100.25";

今私はそれが欲しい

long l1;

1
Longは整数を表します。非整数を指定しました。それで何をしたいですか?
Jon Skeet、2013年

1
strValueが「1100.75」の場合はどうなりますか?参照:stackoverflow.com/questions/633335/...
マグマ

@magma:あなたは小数に変換した場合に与えられた番号は、それが出力されます1101 1100.75だった場合、それは、この場合には、すなわち数を、四捨五入します
愛のコンピュータサイエンス

1
@チャーリーMayPがここでの影響を十分に認識していないようだったので、私は単に問題を提起していました。彼は丸めずに単に整数以外の部分を取り除きたいと思うかもしれません、そしてそれが本当に彼が望んでいるものであれば、それは問題ありません。ありがとう、結構です。
マグマ

回答:


187

この回答は機能しなくなり、ここに記載されている他の回答(下記を参照)よりも優れたものを思い付くことができません。それらを確認し、賛成票を投じてください。

Convert.ToInt64("1100.25")

MSDNのメソッドシグネチャ:

public static long ToInt64(
    string value
)

3
これは私がやった方法です。正解としてマークする必要があります。
sanpaco 2013年

2
正しい形式でない文字列の例外が発生します。
Badhon Jain

これは機能しません。システムフォーマット例外エラー。不正な形式の文字チェーンに関する問題。
RicardoAraújo

正解です。2013年とは異なり、動作しないようです。近日中に更新を投稿します。
ウィルベルマン

46

その数値の整数部分を取得したい場合は、まず浮動小数点数に変換してからlongにキャストする必要があります。

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

Mathクラスを使用して、必要に応じて数値を切り上げるか、単に切り捨てることができます...


これはFormatException、指定された入力でこれを実行すると表示されます。
Andrew Savinykh 2011年

1
@zespri、いいえ、少なくともほとんどの文化ではそうではありません...しかし、小数点記号が "。"でない文化では実際に失敗します。
トーマスレベスク

15

long.TryParseおよびも使用できますlong.Parse

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


6

小数点のため、直接longに変換することはできません。小数点に変換してから、次のようなlongに変換する必要があると思います。

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

お役に立てれば!


3

longは内部的に64ビットの符号付き整数であるSystem.Int64として表されます。取得した値「1100.25」は実際には10進数であり、整数ではないため、longに変換できません。

以下を使用できます。

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

10進数値に変換する



1

Int64.TryParseメソッドを使用して行うこともできます。文字列値の場合は '0'を返しますが、エラーは生成されませんでした。

Int64 l1;

Int64.TryParse(strValue, out l1);

1

独自の変換関数を作成できます。

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

さらに改善できます:

  • パフォーマンス賢い
  • 現在、最初の10進数の後の文字が数字でないかどうかは問題ではないという意味で、検証をより厳密にします
  • 丸め動作を変換関数のパラメーターとして指定します。現在は丸めを行っています
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.