0

我有一个来自数据库的金额的字符串值。我系统上的当地文化是葡萄牙语(pt-br)。因此,具有小数值的金额被读取为,例如:3,4 表示 3.4。我需要以显示 3.4 的方式解析它,但无论我尝试什么,我都会得到 34。我已经在每个地方搜索了解决方案并尝试实现以下内容,但徒劳无功。

//这里的row[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);

它们似乎都不起作用。有人可以建议我是否有其他方法可以实现这一目标?

编辑:

原来我从数据库中得到的值是十进制类型的,所以我将我的 LOC 更改为以下。

decimal d = decimal.Parse(Convert.ToString(row[item.columnName]),new System.Globalization.CultureInfo("pt-BR", false));

它似乎仍然不起作用,我只是不知道哪里出错了。我在DotNetFiddle上尝试了同样的事情 ,它工作得非常好。下面是我尝试过的代码。

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。我究竟做错了什么?

4

4 回答 4

0

您可以使用葡萄牙文化信息

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

或者

Double amt = Double.Parse(Convert.ToString(row[item.columnName]), new CultureInfo("pt-PT", false));
于 2015-10-12T11:04:23.273 回答
0

如果您从数据库中获取双精度值,那么这不是解析问题。在解决方案 1中,您将正确的双精度值转换为字符串(不指定任何文化,因此字符串将按葡萄牙语格式格式化),然后您解析具有不变文化的葡萄牙语字符串,其中,是千位分隔符。

如果您想用英语文化格式化数字,您应该简单地设置当前文化英语:

Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("en-US");

或者,只需在将双精度转换为字符串时指定文化:

var en = CultureInfo.GetCultureInfo("en-US");
// ...
((double)row[item.columnName]).ToString(en);
于 2015-10-12T11:12:12.920 回答
0

也许row[item.columnName]已经是一个double?返回什么row[item.columnName].GetType()

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

也许

double amt = (double)row[item.columnName];

将工作?如果您有decimal,请使用decimal amt = (decimal)row[item.columnName];double amt = (double)(decimal)row[item.columnName];

如果row[item.columnName].GetType()真的是字符串,则转换为:

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

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

于 2015-10-12T11:16:27.483 回答
0

你可以这样尝试:

var x = decimal.Parse("yourDecimal", new NumberFormatInfo() { NumberDecimalSeparator = "," });
于 2015-10-12T11:01:12.183 回答