将带逗号的字符串转换为双精度

Convert a string with commas to double

我有这样一个字符串:99 365 25,633 gghddhdf 35

我需要数组中的所有数字。我的问题是如何处理 25,633 因为 ','。我怎么也能得到这个号码?我的代码是:

public string campDiff(string lineStr1, string lineStr2)
{
    int size;
    string sum = null;
    double num1;
    double num2;
    double number;

    string[] lineArr1 = lineStr1.Split(' '); ;
    string[] lineArr2 = lineStr2.Split(' ');

    if (lineArr1.Length > lineArr2.Length)
    {
        size = lineArr1.Length;
    }
    else
    {
        size = lineArr2.Length;
    }

    for (int i = 0; i < size; i++)
    {

        if (Double.TryParse(lineArr1[i], out num1))
        {


            if (Double.TryParse(lineArr2[i], out num2))
            {

                number = num2 - num1;
                if (number > 0)
                {
                    sum = Convert.ToString(number);
                    return sum;
                }
            }
        }
    }
    return sum;
}

但是它跳过了带逗号的数字。

在做sub之前简单的检查当前lineArrX是否为IsLetter

public class IsLetterSample {
public static void Main() {
    char ch = '8';

    Console.WriteLine(Char.IsLetter(ch));                   // False
    Console.WriteLine(Char.IsLetter("sample string", 7));   // True
}

我假设你的字符串中只有一个包含,的字符串,那么你可以用白色space拆分你的字符串,得到项目包含该字符,然后使用具有 , 作为 NumberDecimalSeparator 的文化将其解析为 double,例如 (tr-TR).

var str = "99 365 25,633 gghddhdf 35";
var element = str.Split(' ').Where(s => s.Contains(',')).ToArray()[0];

double d = double.Parse(element, CultureInfo.GetCultureInfo("tr-TR"));

我使用 tr-TR 因为这是我当前的文化。您可以 Clone 您的 CurrentCulture 并将其 NumberDecimalSeparator 属性 设置为 , 如果不是。

您可以先对字符串进行正则表达式

 Regex.Replace(input, "[^0-9]+", string.Empty);

有很多可能的解决方案。虽然,我认为最好的方法是将 CultureInfo 设置为 Invariant,然后用点替换所有逗号。例如:

Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
string number = "3,2";
double d = double.Parse(number.Replace(",", "."));
Console.WriteLine(d);

在你的代码中会这样:

    double[] numbers1 = 
        lineStr1.Replace(",", ".")
                    .Split(new char[0], StringSplitOptions.RemoveEmptyEntries)
                    .Select(s =>
                    {
                        double value;
                        bool success = double.TryParse(s, NumberStyles.Any, CultureInfo.InvariantCulture, out value);

                        return new { value, success };
                    })
                    .Where(p => p.success)
                    .Select(p => p.value)
                    .ToArray();

    double[] numbers2 = 
        lineStr2.Replace(",", ".")
                    .Split(new char[0], StringSplitOptions.RemoveEmptyEntries)
                    .Select(s =>
                    {
                        double value;
                        bool success = double.TryParse(s, NumberStyles.Any, CultureInfo.InvariantCulture, out value);

                        return new { value, success };
                    })
                    .Where(p => p.success)
                    .Select(p => p.value)
                    .ToArray();

现在你有两个数组 numbers1 和 numbers2 从两个字符串 [=21] 中解析出所有可能的数字=]lineStr1 和 lineStr2。你决定如何处理它们,因为我无法完全理解你的方法的目的。

(感谢评论中的所有人让我编辑我的答案。)