使用逗号和点将字符串解析为double

met*_*cle 55 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();
Run Code Online (Sandbox Code Playgroud)

结果必须是:"你好","0.12","0.12",但它是"你好","123.00","0.12"将以错误的方式对待逗号.有没有人有一个简单而有效的解决方案?

hul*_*ist 131

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

text = text.Replace(',', '.');
return double.TryParse(text, NumberStyles.Any, CultureInfo.InvariantCulture, out value);
Run Code Online (Sandbox Code Playgroud)

  • 这可能会导致千位分隔符出现一些问题。 (2认同)
  • @alan-mattano 这个解决方案是针对特定问题的。没有适用于所有文化的单一解决方案,您必须首先检测正在使用的文化,然后相应地选择算法。 (2认同)

Oli*_*sad 33

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

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

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

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));
}
Run Code Online (Sandbox Code Playgroud)

结果如下 在此输入图像描述

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

  • 这应该是公认的答案。如果您需要更多限制,您也可以使用“NumberStyles.AllowDecimalPoint”作为第二个参数。这对我来说效果很好! (2认同)

mmd*_*bas 26

你想像点.逗号(,)一样对待dot ().所以,替换

if (double.TryParse(values[i, j], out tmp))
Run Code Online (Sandbox Code Playgroud)

if (double.TryParse(values[i, j].Replace('.', ','), out tmp))
Run Code Online (Sandbox Code Playgroud)

  • 解析时需要指定文化,否则它只能在当前文化使用","作为小数点的情况下工作. (30认同)
  • 替换是个坏主意,因为具有其他文化设置的PC上的应用程序将失败...我将在稍后编写更好的修复程序. (3认同)
  • 我知道线程已经死了,但是我会用`replace(char,char)`替换`Replace(string,string)`以获得更好的性能..... (2认同)

Dan*_*ker 16

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

在我的文化中,

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

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

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

如果您确定您的数字从不包含除小数分隔符的逗号或点以外的任何内容(即没有数千个分隔符),我会String.Replace()用逗号加点,然后像您一样完成其余操作.

否则,你将很难编程一些可以1.1231,123不了解文化的情况下进行区分的东西.


Sin*_*lto 8

制作两种静态区域性,一种用于逗号,一种用于点。

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

    var pointCulture = new CultureInfo("en")
    {
        NumberFormat =
        {
            NumberDecimalSeparator = "."
        }
    };
Run Code Online (Sandbox Code Playgroud)

然后根据输入分别使用每一个(使用函数):

    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!");
    }
Run Code Online (Sandbox Code Playgroud)

然后循环遍历你的数组

    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));
    }
Run Code Online (Sandbox Code Playgroud)

即使宿主环境和文化发生变化,这也应该有效。


小智 7

简单使用:

double.Parse("3.5", CultureInfo.InvariantCulture)
Run Code Online (Sandbox Code Playgroud)