C# 如何用逗号解析双字符串?

C# 如何用逗号解析双字符串?,c#,formatting,C#,Formatting,我尝试用逗号将值解析为双精度 示例: var strValue = "-0,246"; double value = 0; double.TryParse(strValue, NumberStyles.Float, CultureInfo.InvariantCulture, out value); 结果:0。 如果我尝试使用numberstyle.Any,结果是246 如何做出有效的结果 p.S.我尝试在字符串中替换点上的逗号。这是可行的,但我认为这是一个复杂的解决方案 您应该指定预期的区域性

我尝试用逗号将值解析为
双精度

示例:

var strValue = "-0,246";
double value = 0;
double.TryParse(strValue, NumberStyles.Float, CultureInfo.InvariantCulture, out value);
结果:
0。

如果我尝试使用
numberstyle.Any
,结果是246

如何做出有效的结果


p.S.我尝试在
字符串中替换点上的逗号。这是可行的,但我认为这是一个复杂的解决方案

您应该指定预期的区域性格式,但是您可以这样指定数字分隔符:

Double.Parse(
"-0,233", 
新建CultureInfo(CultureInfo.CurrentCulture.Name)
{ 
NumberFormat=newnumberformatinfo(){NumberDecimalSeparator=“,”}
}
)

使用
字符串。替换
以消除数字字符串中的逗号:

var strValue =" -0,246";
strValue = strValue.Replace(",", ".");
double value=0;
double.TryParse(strValue,NumberStyles.Float, CultureInfo.InvariantCulture, out value);

您应该提供不同的区域性,因为在
InvariantCulture
中,逗号
是一个千位分隔符,在允许时将被忽略(因此在
numberstyle.Any
的情况下,您有-246):

您可以尝试,比如说,
CurrentCulture
(如果当前区域性使用
作为十进制分隔符)

或者把一种特定的文化,例如俄罗斯文化:

double.TryParse(strValue, NumberStyles.Float, CultureInfo.GetCultureInfo("ru-RU"), out value);
您可以这样使用:

var strValue = "-0,246";
double value = 0;

// Create a NumberFormatInfo object
NumberFormatInfo nfi = new CultureInfo("en-US", false).NumberFormat;
// Store the current value to restore it later
var currentSeperator = nfi.NumberDecimalSeparator;

// Change the seperator and parse the value
nfi.NumberDecimalSeparator = ",";
value = double.Parse(strValue, nfi);

// Restore the separator
nfi.NumberDecimalSeparator = currentSeperator;
在本例中,在解析值后,将恢复分隔符

将此方法放在扩展方法中很好:

class DoubleExtensions
{
    public double ParseToDouble(this string strValue)
    {           
        // Create a NumberFormatInfo object
        NumberFormatInfo nfi = new CultureInfo("en-US", false).NumberFormat;

        // Store the current value to restore it later
        var currentSeperator = nfi.NumberDecimalSeparator;

        // Change the seperator and parse the value
        nfi.NumberDecimalSeparator = ",";

        try
        {
            if (double.TryParse(strValue, nfi, out var value))
            {
                return value;
            }           
        }
        finally
        {
            // Restore the separator
            nfi.NumberDecimalSeparator = currentSeperator;
        }

        return 0;
    }
}
然后像这样使用它:

var strValue = "-0,246";
double value = strValue.ParseToDouble();

“-0246”不能解析为
InvariantCulture
,因为它显然是特定于区域性的格式。不变格式使用点,而不是逗号。您必须使用特定于区域性的解析或将字符串转换为区域性不变格式。您使用的是不变区域性。使用输入字符串的区域性。@jdweng-您的语句
InvariantCulture使用您的计算机设置为的当前区域性是错误的-
InvariantCulture
在任何计算机上都是相同的-@jdweng,我的当前区域性是ru-ru。当我使用“CurrentCulture”时,它工作得很好。我猜你是在过度思考你的问题-既然你说你的当前文化是
ru-ru
,并且你的字符串是该文化中的有效小数,那么你实际上想做什么?为什么需要点?在您的示例中,值应该是
-246
,这不是他输入的吗?预期结果是
-0.246
(即俄罗斯文化使用
作为十进制分隔符,而美国文化使用
class DoubleExtensions
{
    public double ParseToDouble(this string strValue)
    {           
        // Create a NumberFormatInfo object
        NumberFormatInfo nfi = new CultureInfo("en-US", false).NumberFormat;

        // Store the current value to restore it later
        var currentSeperator = nfi.NumberDecimalSeparator;

        // Change the seperator and parse the value
        nfi.NumberDecimalSeparator = ",";

        try
        {
            if (double.TryParse(strValue, nfi, out var value))
            {
                return value;
            }           
        }
        finally
        {
            // Restore the separator
            nfi.NumberDecimalSeparator = currentSeperator;
        }

        return 0;
    }
}
var strValue = "-0,246";
double value = strValue.ParseToDouble();