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