web-dev-qa-db-ja.com

C#浮動小数点を含む文字列を整数に変換する

たとえば、空の文字列や「1.2」を含む文字列を取得して整数に変換する最良の方法は何ですか?もちろん、int.TryParseは失敗します。私は、float.TryParseを使用してからintに変換したくありません。

17
Nir

解決策1:Convert.ToDouble(文化に依存)

Convert.ToDoubleを使用できます。しかし、注意してください!以下の解決策は、現在のカルチャの設定の数字区切り文字がピリオド文字である場合にのみ機能します。

var a = (int)Convert.ToDouble("1.2");    

解決策2:Convert.ToDouble(文化に依存しない)

IFormatProvider を使用し、現在のカルチャ設定から独立した方法で数値を変換することをお勧めします。

var a = (int)Convert.ToDouble("1.2", CultureInfo.InvariantCulture.NumberFormat); 

解決策3:解析と分割

このタスクを実行する別の方法は、解析された文字列でSplitを使用することです。

var a = int.Parse("1.2".Split('.')[0]);

または:

var a = int.Parse("1.2".Split('.').First());

ノート

37

floatに解析して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;
 }

コードをグローバル化するには、"."System.Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator に置き換える必要があります。

5
Mark Cidade

たぶん、文字列関数を使用して浮動小数点の後のすべてを削除してから、intに変換することができます。しかし、真剣に私はそれがfloatに変換してからintに変換するよりも良いとは思いません。

1
fuwaneko
int a = (int)Math.Round(float.Parse("0.9"));

0.9fを1ではなく0に変換する場合を除いて、最初に丸める必要があります。

1
Struan

Visual Basicランタイムライブラリを使用して、c#からこれを実行できます。

アセンブリMicrosoft.VisualBasic.dllへの参照をソリューションに追加する必要があります。

次に、次のコードで変換を行います。

using VB = Microsoft.VisualBasic.CompilerServices;

class Program
{
    static void Main(string[] args)
    {
        int i = VB.Conversions.ToInteger("1.2");
    }
}
0
David

私はこれと同じ問題を抱えていて、MarkとDariuszのハイブリッドを使用することになりました。

 if (num == "")
     {
      num = "0.00";
     }

  var num1 = (float)Convert.ToDouble(num);
0
Jared

別の方法として、文字列を小数(。)を区切り文字として分割し、整数を解析する方法があると思います。もちろん、文字列に"37.56 miles in 32.65 seconds"型の値のような値が含まれる可能性があるかどうかはまだ尋ねていません。

文字列には値(文字列または数値)が1つしかないことを考えると、次の行で何かを考えることができます。

public int64 GetInt64(string input)
{
    if (string.IsNullOrEmpty(input)) return 0;
    // Split string on decimal (.)
    // ... This will separate all the digits.
    //
    string[] words = input.Split('.');
    return int.Parse(words[0]);
}
0
Kangkan