解析带小数点的值

时间:2015-10-12 10:52:10

标签: c# parsing cultureinfo invariantculture

我有一个来自数据库的金额的字符串值。我系统上的当地文化是葡萄牙语(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);

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

修改

事实证明我从DB获得的值是十进制类型,所以我将我的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 个答案:

答案 0 :(得分:0)

您可以尝试这样:

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

答案 1 :(得分:0)

您可以使用potrugal culture info

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

答案 2 :(得分:0)

如果从数据库中获取double值,那么这不是解析问题。在 Solution 1 中,将正确的double值转换为string(不指定任何区域性,因此字符串将按葡萄牙格式进行格式化),然后使用不变文化解析葡萄牙语字符串,其中{{ 1}}是一千个分隔符。

如果您想使用英国文化格式化数字,您应该只设置当前的英语文化:

,

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

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

答案 3 :(得分:0)

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

没有理由采用(盒装)double并将其格式化为字符串(不指定文化),然后将该字符串解析回double(指定文化)。即使Convert.ToString的重载需要IFormatProvider(可能是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()真的是String,则转换为:

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

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