Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 解析国际化问题_C#_String_Double_Culture_Cultureinfo - Fatal编程技术网

C# 解析国际化问题

C# 解析国际化问题,c#,string,double,culture,cultureinfo,C#,String,Double,Culture,Cultureinfo,这让我快发疯了。我在ASP.NET2.0WebForm页面中有以下字符串 string s = "0.009"; 很简单。现在,如果我的文化是西班牙语,也就是“es”,并且我尝试将字符串转换为Double,那么我将执行以下操作: double d = Double.Parse(s, new CultureInfo("es-ES")); 我期望的是0009。相反,我得到了9分。我知道.NET认为它是一个千位分隔符,在美国英语中是一个逗号,但它不应该将我传递给解析方法的区域性信息应用到转换中吗

这让我快发疯了。我在ASP.NET2.0WebForm页面中有以下字符串

string s = "0.009";
很简单。现在,如果我的文化是西班牙语,也就是“es”,并且我尝试将字符串转换为Double,那么我将执行以下操作:

double d = Double.Parse(s, new CultureInfo("es-ES"));
我期望的是0009。相反,我得到了9分。我知道.NET认为它是一个千位分隔符,在美国英语中是一个逗号,但它不应该将我传递给解析方法的区域性信息应用到转换中吗

如果我这样做

double d = 0.009D;
string formatted = d.ToString(new CultureInfo("es-ES"));

格式现在是0009。有人吗?

正在接受您提供的文化并应用正确的格式。您提供了一个字符串“0.009”,并告诉它它是西班牙语…然后您抱怨它正确地将其解释为西班牙语!当你知道字符串不是西班牙语时,不要告诉它字符串是西班牙语

您应该将正在解析的字符串的区域性传递给Parse方法,在本例中,该区域性将是en-US或en-Gb或InvariantCulture。

您将其向后传递

当你说
double d=double.Parse(s,newCultureInfo(“es”)),您要求.NET将字符串解析为双精度,假设该字符串是在es区域性中编写的

在西班牙文化中,“.”是千位分隔符,所以“0.009”是9

当您使用ToString()进行转换时,最后的意思是使用西班牙语区域性将0.009转换为字符串,因此它使用“,”作为小数分隔符,得到“0009”。这种行为是正确的


我猜您希望使用Double.Parse和不变区域性,并使用ToString和西班牙语区域性,因此0.009变为0009。

您将解析和格式设置搞错了。您第一次得到的是9而不是.009,因为您获取了在基于-的区域性中格式化的字符串,并使用基于-的区域性对其进行解析。您需要使用创建时使用的任何区域性对其进行解析,然后使用您想要显示的任何区域性对其进行格式化。

我认为您的解释是错误的,在es es中,区域性0.009实际上只是说9的一段很长的路,因为“.”不是小数分隔符,因此如果您要求字符串“0.009”要使用es文化进行解析,您确实应该获得Deouble9.0。如果你要求它解析“0009”,你应该得到一个双精度的0.009

类似地,如果要求它格式化双精度0.009,则应在es中获得字符串“0009”


在es文化中,“是一个十进制的演说家(不是)”

杰西写的东西对我来说很有用。对于任何需要尝试如何获得“不变文化”的人来说:看起来是这样的

double d=double.Parse(myString,CultureInfo.InvariantCulture)


(第一个stackoverflow帖子,是的,相当边缘化;)

是的,我完全搞错了。谢谢你们的回答。这真的很有帮助,没问题。我很乐意帮忙。抱歉,如果我的回答有点尖锐-本来不是这样的,但是现在重新阅读,它看起来像我是一个正确的git。关于这一点的更多详细信息以及本地化的许多其他问题,例如,如果myString是4,5,那么上面的代码将给你45,不适用于西班牙语languageno,也不应该。请参阅:“不变的文化是文化不敏感的;它与英语相关,但与任何国家/地区无关。”。如果您知道您的号码是西班牙文格式的,您应该提供相应的CultureInfo:
new CultureInfo(“es”)
double d = Double.Parse("0,009",
    NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands,
    CultureInfo.CreateSpecificCulture("es-ES"));