82

基本的に文字列の配列を文字列の配列に変換する関数を作成しようとしています。この場合、配列内のすべての倍精度浮動小数点数は、設定した小数点以下の桁数に丸められます。配列には、double値をまったく含まない文字列が含まれる場合もあります。

string[,] values = new string[1, 3];

values[0, 0] = "hello";
values[0, 1] = "0.123";
values[0, 2] = "0,123";

int decimalPlaces = 2;

double tmp;
string format = "F" + decimalPlaces.ToString();
IFormatProvider provider = CultureInfo.InvariantCulture;
for (int i = 0; i < values.GetLength(0); i++)
{
    for (int j = 0; j < values.GetLength(1); j++)
    {
        if (double.TryParse(values[i, j], out tmp))
        {
            values[i, j] = tmp.ToString(format, provider);
        }
    }
}

Console.ReadLine();

結果は「hello」、「0.12」、「0.12」である必要がありますが、「hello」、「123.00」、「0.12」はカンマを間違った方法で処理します。誰かがこれのためのシンプルで効率的な解決策を持っていますか?

4

13 に答える 13

170

、、およびの両方を処理します。小数点として、一方を他方に置き換えるだけでなく、解析で使用されるカルチャがそれを小数点として解釈することを確認する必要があります。

text = text.Replace(',', '.');
return double.TryParse(text, NumberStyles.Any, CultureInfo.InvariantCulture, out value);
于 2013-10-30T09:38:34.920 に答える
52

カンマとドットを置き換える必要はありません。

私も同じ問題を抱えています。理由は単純です。変換カルチャは、コンマまたはドットが解釈される大きな役割を果たします。私は、コンマが分数を区別するドイツの文化を使用していますが、他の場所ではドットが機能します。

ここでは、違いを明確にするために完全な例を作成しました。

string[] doubleStrings = {"hello", "0.123", "0,123"};
double localCultreResult;
foreach (var doubleString in doubleStrings)
{
    double.TryParse(doubleString, NumberStyles.Any, CultureInfo.CurrentCulture, out localCultreResult);
    Console.WriteLine(string.Format("Local culture results for the parsing of {0} is {1}", doubleString, localCultreResult));
}

double invariantCultureResult;
foreach (var doubleString in doubleStrings)
{
    double.TryParse(doubleString, NumberStyles.Any, CultureInfo.InvariantCulture, out invariantCultureResult);
    Console.WriteLine(string.Format("Invariant culture results for the parsing of {0} is {1}", doubleString, invariantCultureResult));
}

結果は次のとおりです。 ここに画像の説明を入力してください

文化をいじってみると、必要な結果が得られます。

于 2015-02-24T09:32:45.030 に答える
29

.ドット( )をコンマ()のように扱いたい,。だから、交換してください

if (double.TryParse(values[i, j], out tmp))

if (double.TryParse(values[i, j].Replace('.', ','), out tmp))
于 2012-07-19T12:13:01.910 に答える
19

問題は、コンマまたはドットの両方である可能性がある場合、小数点記号と千単位の区切り文字を区別できないことです。例えば:

私の文化では、

1.1231000を超える数値の通常の表記です。一方

1,1231に近い数です。

不変カルチャを使用すると、デフォルトで小数点としてドットが使用されます。一般に、すべての数値がすべてのシステムで同じ定数カルチャを使用して記述されていることを確認する必要があります(たとえば、不変カルチャ)。

数値に小数点記号のコンマまたはドット以外のものが含まれていないことが確実な場合(つまり、千単位の区切り文字がない場合)、String.Replace()コンマにドットを付けて、残りはあなたと同じようにします。

そうしないと、文化を知らなくても1.123区別できるものをプログラミングするのに苦労するでしょう。1,123

于 2012-07-19T12:06:24.737 に答える
5

2つの静的カルチャを作成します。1つはコンマ用、もう1つはポイント用です。

    var commaCulture = new CultureInfo("en")
    {
        NumberFormat =
        {
            NumberDecimalSeparator = ","
        }
    };

    var pointCulture = new CultureInfo("en")
    {
        NumberFormat =
        {
            NumberDecimalSeparator = "."
        }
    };

次に、入力に応じて(関数を使用して)それぞれを使用します。

    public double ConvertToDouble(string input)
    {
        input = input.Trim();

        if (input == "0") {
            return 0;
        }

        if (input.Contains(",") && input.Split(',').Length == 2)
        {
            return Convert.ToDouble(input, commaCulture);
        }

        if (input.Contains(".") && input.Split('.').Length == 2)
        {
            return Convert.ToDouble(input, pointCulture);
        }

        throw new Exception("Invalid input!");
    }

次に、配列をループします

    var strings = new List<string> {"0,12", "0.122", "1,23", "00,0", "0.00", "12.5000", "0.002", "0,001"};
    var doubles = new List<double>();

    foreach (var value in strings) {
        doubles.Add(ConvertToDouble(value));
    }

これは、ホスト環境と文化が変わっても機能するはずです。

于 2019-02-05T17:30:53.233 に答える
3

簡単な使用:

double.Parse("3.5", CultureInfo.InvariantCulture)
于 2021-03-30T10:00:28.833 に答える
1

このdouble.TryParseのオーバーロードを使用して、許可される形式を指定します。

Double.TryParseメソッド(String、NumberStyles、IFormatProvider、Double%)

デフォルトでは、double.TryParseは現在のカルチャ固有の形式に基づいて解析します。

于 2012-07-19T12:06:11.287 に答える
1

文字列から10進数を解析するための拡張。

  • 文字列の最初、最後、または途中に番号は関係ありません。
  • 「ごみ」の文字の数や数が多いかどうかは関係ありません。
  • PCのカルチャ設定で設定されている区切り文字に関係なく、ドットとカンマの両方が正しく解析されます。
  • 小数点記号を手動で設定する機能。

    public static class StringExtension
    {
        public static double DoubleParseAdvanced(this string strToParse, char decimalSymbol = ',')
        {
            string tmp = Regex.Match(strToParse, @"([-]?[0-9]+)([\s])?([0-9]+)?[." + decimalSymbol + "]?([0-9 ]+)?([0-9]+)?").Value;
    
            if (tmp.Length > 0 && strToParse.Contains(tmp))
            {
                var currDecSeparator = System.Windows.Forms.Application.CurrentCulture.NumberFormat.NumberDecimalSeparator;
    
                tmp = tmp.Replace(".", currDecSeparator).Replace(decimalSymbol.ToString(), currDecSeparator);
    
                return double.Parse(tmp);
            }
    
            return 0;
        }
    }
    

使い方:

"It's 4.45 O'clock now".DoubleParseAdvanced(); // will return 4.45
"It's 4,45 O'clock now".DoubleParseAdvanced(); // will return 4.45
"It's 4:45 O'clock now".DoubleParseAdvanced(':'); // will return 4.45
于 2016-11-08T03:23:28.163 に答える
0

文字列に小数点が含まれているかどうかは、次を使用して確認できます。

string s="";

        if (s.Contains(','))
        { 
        //treat as double how you wish
        }

次に、それを小数として扱います。それ以外の場合は、double以外の値を渡します。

于 2012-07-19T12:09:11.957 に答える
0

もう1つのオプションは、CultureInfoクラスの小数点の情報を使用することです。'、'を'。'に置き換えることができることを知っています。または必要に応じてその逆。1,000,000.23のような数値で何かを行う必要がある場合は、このクラスで数値グループ化記号も使用できます。

string decimalSeparator = CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator;
        string value = "";

        if (decimalSeparator == ".")
        {
            value = rateLimitTextBox.Text.Replace(",", ".");
        }
        else if (decimalSeparator == ",")
        {
            value = rateLimitTextBox.Text.Replace(".", ",");
        }

        bool LimitAcceptable = decimal.TryParse(value, NumberStyles.Any, CultureInfo.CurrentCulture, out decimal limit);
于 2021-03-31T22:05:48.583 に答える
0

小数点記号だけで数値を解析する場合は、次のスニペットを使用します。

public bool TryParseDecimal(string value, out decimal result) {
    const string your_separator = ",";

    var numberFormat = new NumberFormatInfo {
            NumberDecimalSeparator = your_separator
    };

    return decimal.TryParse(value, NumberStyles.AllowDecimalPoint, numberFormat, out result);
}

カルチャや文字列操作を使用しても、数値を「。」以外で変換する意図を表すとは思いません。小数点。

于 2021-07-08T07:34:48.450 に答える
0

私にとって、カルチャ情報を使用することはオプションではありませんでした。アプリは異なるカルチャを持つシステムで実行されていましたが、未知のカルチャの場所で解析される入力文字列でした。

そこで、文字列表現を正規化してから、CultureInfo.InvariantCultureを使用して変換することに言及しました。

    private static double NormalizeAndParse(string strDouble)
    {
        string strDoubleNormalized;

        if (strDouble.Contains(","))
        {
            var strReplaced = strDouble.Replace(",", ".");
            var decimalSeparatorPos = strReplaced.LastIndexOf('.');
            var strInteger = strReplaced.Substring(0, decimalSeparatorPos);
            var strFractional = strReplaced.Substring(decimalSeparatorPos);

            strInteger = strInteger.Replace(".", string.Empty);
            strDoubleNormalized = strInteger + strFractional;
        }
        else
        {
            strDoubleNormalized = strDouble;
        }

        return Double.Parse(strDoubleNormalized, NumberStyles.Any, CultureInfo.InvariantCulture);
    }
于 2022-03-03T10:41:15.037 に答える
-1

これを試してみてください...それは私のために働きます。

double vdouble = 0;
string sparam = "2,1";

if ( !Double.TryParse( sparam, NumberStyles.Float, CultureInfo.InvariantCulture, out vdouble ) )
{
    if ( sparam.IndexOf( '.' ) != -1 )
    {
        sparam = sparam.Replace( '.', ',' );
    }
    else
    {
        sparam = sparam.Replace( ',', '.' );
    }

    if ( !Double.TryParse( sparam, NumberStyles.Float, CultureInfo.InvariantCulture, out vdouble ) )
    {
        vdouble = 0;
    }
}
于 2015-05-27T15:27:07.213 に答える