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