用逗号和点解析字符串加倍

时间:2012-07-19 12:03:21

标签: c#

我正在尝试编写一个函数,它基本上将字符串数组转换为字符串数组,其中数组中的所有双精度数都舍入为我设置的小数位数。数组中也可以有字符串,它们根本没有双重值。

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();

结果必须是:“你好”,“0.12”,“0.12”但它是“你好”,“123.00”,“0.12”会以错误的方式对待逗号。有没有人为此提供简单有效的解决方案?

12 个答案:

答案 0 :(得分:122)

对待两者,和。作为小数点,您不仅必须将其替换为另一个,还要确保Culture使用解析将其解释为小数点。

text = text.Replace(',', '.');
return double.TryParse(text, NumberStyles.Any, CultureInfo.InvariantCulture, out value);

答案 1 :(得分:30)

您希望将逗号(.)视为逗号(,)。所以,替换

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

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

答案 2 :(得分:23)

你不需要替换逗号和点..

我遇到了同样的问题。原因很简单,转换文化在解释逗号或点的过程中发挥着重要作用。我使用德国文化,其中逗号区分分数,其他地方的点可以完成工作。

在这里,我做了一个完整的例子,以明确区别。

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

结果如下: enter image description here

玩弄文化,您将获得所需的结果。

答案 3 :(得分:15)

问题是当(或系统)可以是逗号或点时,您(或系统)无法区分小数分隔符和千位分隔符。例如:

  

在我的文化中,

     

1.123是1000以上数字的正常表示法;而

     

1,123是一个接近1的数字。

使用不变文化默认使用点作为小数分隔符。一般来说,你应该确保所有数字都是在所有系统上使用相同的常量文化编写的(例如不变文化)。

如果您确定您的数字从不包含除小数分隔符的逗号或点以外的任何内容(即没有千位分隔符),我会用逗号String.Replace()逗号,并执行其余操作

否则,如果不了解文化,您将很难编写可以区分1.1231,123的内容。

答案 4 :(得分: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;
    }
}

答案 5 :(得分:1)

从字符串解析十进制数的扩展名。

  • 无论数字是在字符串的开头,结尾还是中间。
  • 无论是否只有数量或数量的&#34;垃圾&#34;字母。
  • 无论在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

答案 6 :(得分: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));
    }

即使宿主环境和文化发生了变化,这也应该起作用。

答案 7 :(得分:1)

简单使用:

target 'testBanner5' do
 pod "Google-Mobile-SDK"
end

target 'testBanner5Test' do
 #pod "Google-Mobile-SDK"
end

target 'testBanner5UITest' do
 #pod "Google-Mobile-SDK"
end

答案 8 :(得分:0)

使用double.TryParse的重载来指定允许的格式:

Double.TryParse Method (String, NumberStyles, IFormatProvider, Double%)

默认情况下,double.TryParse将根据当前的特定于文化的格式进行解析。

答案 9 :(得分:0)

您可以使用

检查字符串是否包含小数点

string s="";

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

然后将其视为小数,否则只需传递非双精度值。

答案 10 :(得分: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);
}

我不认为使用区域性或字符串操作表达将数字转换为非 '.' 的意图。小数点。

答案 11 :(得分:-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);