C# 解析带小数点的值

C# 解析带小数点的值,c#,parsing,cultureinfo,invariantculture,C#,Parsing,Cultureinfo,Invariantculture,我有一个字符串值,表示来自DB的金额。我的系统中的本地文化是葡萄牙语(pt br)。因此,对于ex:3,带十进制值的金额被读取为3.4。我需要以这样一种方式来解析它,它显示3.4,但不管我怎么做,我都会得到34。我到处寻找解决方案,并尝试实现以下内容,但徒劳无功 //这里的行[item.columnName]是我正在循环的DataTable的行 解决方案1: Double amt = Double.Parse(Convert.ToString(row[item.columnName]), Cu

我有一个字符串值,表示来自DB的金额。我的系统中的本地文化是葡萄牙语(pt br)。因此,对于ex:3,带十进制值的金额被读取为3.4。我需要以这样一种方式来解析它,它显示3.4,但不管我怎么做,我都会得到34。我到处寻找解决方案,并尝试实现以下内容,但徒劳无功

//这里的行[item.columnName]是我正在循环的DataTable的行

解决方案1:

 Double amt = Double.Parse(Convert.ToString(row[item.columnName]), CultureInfo.InvariantCulture);
解决方案2:

CultureInfo usCulture = new CultureInfo("en-US");
NumberFormatInfo dbNumberFormat = usCulture.NumberFormat;
Double amt = Double.Parse(Convert.ToString(row[item.columnName]), dbNumberFormat);
这两种方法似乎都不管用。有人能建议我是否还有其他方法可以做到这一点吗

编辑:

事实证明,我从DB中得到的值是decimal类型,因此我将LOC更改为以下

decimal d = decimal.Parse(Convert.ToString(row[item.columnName]),new System.Globalization.CultureInfo("pt-BR", false));
它似乎仍然不起作用,我只是不知道我哪里出了问题。我也试过同样的方法 而且它工作得非常好。下面是我尝试的代码

using System;

public class Program
{
    public static void Main()
    {
        decimal d = decimal.Parse("1,35",new System.Globalization.CultureInfo("pt-BR", false));
        Console.WriteLine(d.ToString());
    }
}
我得到的结果和预期的一样是1.35。我做错了什么?

您可以这样尝试:

var x = decimal.Parse("yourDecimal", new NumberFormatInfo() { NumberDecimalSeparator = "," });

您可以使用potrugal culture info

CultureInfo usCulture = new CultureInfo("pt-PT", false);
NumberFormatInfo dbNumberFormat = usCulture.NumberFormat;
Double amt = Double.Parse(Convert.ToString(row[item.columnName]), dbNumberFormat);


如果从数据库中获取双值,则这不是解析问题。在解决方案1中,将正确的双精度值转换为字符串(不指定任何区域性,因此字符串将采用葡萄牙语格式),然后使用固定区域性解析葡萄牙语字符串,其中
是一个千位分隔符

如果要使用英语区域性设置数字格式,只需将当前区域性设置为英语:

Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("en-US");
或者,在将double转换为字符串时只需指定区域性:

var en = CultureInfo.GetCultureInfo("en-US");
// ...
((double)row[item.columnName]).ToString(en);

也许
行[item.columnName]
已经是
双精度的了
行[item.columnName].GetType()返回什么

没有理由将(装箱的)
double
格式化为字符串(不指定区域性),然后将该字符串解析回
double
(指定区域性)。即使
Convert.ToString
有一个重载,该重载将
IFormatProvider
(可能是
CultureInfo
)作为其第二个参数

也许吧

行吗?如果您有一个
decimal
,请使用
decimal amt=(decimal)行[item.columnName]或<代码>双倍金额=(双倍)(十进制)行[项目.columnName]

如果
行[item.columnName].GetType()
实际上是字符串,则转换为:

double amt = Double.Parse((string)row[item.columnName], someGoodCulture);

我个人不喜欢
Convert.ToString
,因为很难看出它是根据当前线程的当前区域性直接向下转换已经存在的
string
,还是格式化一些
IFormattable
实例(例如
double
decimal
),或者只是调用
.ToString()
在某个任意对象上。

您能澄清一下:Convert.ToString(row[item.columnName])的确切字符串是什么吗
?如果它有一个逗号,那么将其解析为不变量当然行不通。您必须使用PT br区域性。
row[item.columnName].GetType()
是否已经是数字类型?是否确实在数据库中存储字符串?我怀疑,因为如果是这样,您就不需要调用
Convert.ToString
。那么您的db列的类型是什么呢?这没有帮助。它给我的值为3,4,而我正在寻找3.4hi Akshatha,我假设您的DB以及应用程序服务器都在pt br中,因此在加载时,您可能必须转换为国际或英语文化。如果需要在屏幕上打印double,则必须在显示double amt=double.Parse(“1.233,4”,new CultureInfo(“pt BR”,false))时进行转换;控制台写入线(amt);Console.WriteLine(amt.ToString(新文化信息(“pt-BR”,false));Console.WriteLine(amt.ToString(新文化信息(“en”,false));这对我有用
double amt = (double)row[item.columnName];
double amt = Double.Parse((string)row[item.columnName], someGoodCulture);