我从Oracle数据库收到以下值(作为varchar):7876,72
在Visual Studio中,它被读作String
案例1(预期案例):
当我调试时,我看到:7876.72
当我尝试Convert.ToDecimal("7876.72")
时,我得到7876.72D
案例2(错误案例):
当我调试时,我看到:7876,72
当我尝试Convert.ToDecimal("7876,72")
时,我得到787672D
我正在检查CultureInfo.CurrentCulture
和RegionInfo.CurrentRegion
,两台机器上都是一样的......
主要原因是:
Convert.ToDecimal("7876,72").ToString("0,0.00", CultureInfo.InvariantCulture)
给了我:787,672.00
,它应该是7,876.72
。
Global.asax - Application_Start
Dim newCulture As CultureInfo = DirectCast(System.Threading.Thread.CurrentThread.CurrentCulture.Clone(), CultureInfo)
newCulture.DateTimeFormat.ShortDatePattern = "yyyy/MM/dd"
newCulture.DateTimeFormat.DateSeparator = "/"
newCulture.NumberFormat.CurrencyDecimalSeparator = "."
newCulture.NumberFormat.NumberDecimalSeparator = "."
Thread.CurrentThread.CurrentCulture = newCulture
关于如何在两台机器上保持相同价值的任何想法?
提前致谢!
答案 0 :(得分:0)
您将上述输出视为未预期,因为以下值7876,72
等于787672
。逗号仅用于分隔数字,但转换时不用于表示小数点。但是,小数点由以下字符 .
我建议您将字符,
替换为.
,因为您希望获得小数点而不是,
。
示例强>
string NumberFromDatabase = "7876,72"; //Initialize a new string of name NumberFromDatabase as 7876,72
string NumberAfterReplacement = NumberFromDatabase.Replace(',', '.'); //Initialize a new string of name NumberAfterReplacement as 7876.72
decimal Output = Convert.ToDecimal(NumberAfterReplacement); //Initialize a new decimal of name Output as 7876.72
谢谢, 我希望你觉得这很有帮助:)
答案 1 :(得分:0)
对于数字:将TryParse(...)
与适当的NumberStyle
对于日期:这是ParseExact
答案 2 :(得分:0)
问题在于Oracle客户端,我的开发人员机器和服务器机器之间存在一些不一致,这是两台机器上显示不同的日期和小数值的主要原因。
解决方案是强制两台计算机的行为方式相同,为此我们更改了Oracle客户端的密钥并添加了所需的参数:
希望它可以帮助别人。