ボックス化解除を使わない文字列型から数値型への変換

TIPS
文字列を数値へ変換する機会は意外と多いものです。

画面の入力項目やファイルの読み込みやストリームからの読み込み等々。

通常は、各数値型の構造体メンバであるParseメソッドやConvertクラスにある変換用メソッドなどを使います。

どれが一番速いのかと検証し結果、以下のような実装が速かったのです。

string型からint型への変換

public static class StringExtensions
{
    public static int ToInt32(this string value)
    {
        int ret = 0;
 
        for(int n = 0; n < value.Length; n++)
        {
            ret = ret * 10 + (value[n] - '0');
        }
 
        return ret;
    }
}

string型からdouble型への変換

public static class StringExtensions
{
    public static double ToDouble(this string value)
    {
        double ret = 0;
 
        double fraction = 1;
        bool isFraction = false;
 
        for (int n = 0; n  < value.Length; n++)
        {
            char target = value[n];
 
            if(value[n] == '.')
            {
                isFraction = true;
            }
            else
            {
                ret = ret * 10 + (value[n] - '0');
 
                if (isFraction)
                {
                    fraction = fraction * 10;
                }
            }
        }
 
        return ret / fraction;
    }
}
UNIコードの数文字は連続して定義されているので、その差分で算出する方式ですね。

以前別のブログで書いた記事なのですが、問題は3つあります。

1.ボックス化解除と何の関係もない

 文字列は参照型で数値は値型なのでボックス化解除かと思ったんでしょうか。タイトルと内容が違う。恥ずかしい。

2.Double型の変換は小数点以下の桁数が多いとdouble.Parseメソッド等との計算結果に誤差が生じる。

 2進数の問題ですね。少数以下15桁ぐらいで違ってきます。

3..NET Coreではパフォーマンスに差異がない。

 .NET Framework4.8で検証すると上記の方式の方が数倍速いのですが、.NET Coreやその後継の.NET 5.0ではParseやConvertの処理速後が遜色なくなってました。

以上より、今後はこういう実装は不要です。標準ライブラリのメソッドを使いましょう。
TIPS
スポンサーリンク
C#プログラミング再入門